在部分编程语言中,我们可以动态地将原数组长度扩大,此时我们就可以使用双指针算法,来降低空间的使用:
- 首先遍历一遍原数组,求出最终答案的长度length;
- 将原数组resize成length大小;
- 使用两个指针,指针i指向原字符串的末尾,指针j指向length的位置;
- 两个指针分别从后往前遍历,如果str[i] == ' ',则指针j的位置上依次填充'0', '2', '%',这样倒着看就是"%20";如果str[i] != ' ',则指针j的位置上填充该字符即可。
由于i之前的字符串,在变换之后,长度一定不小于原字符串,所以遍历过程中一定有i <= j,这样可以保证str[j]不会覆盖还未遍历过的str[i],从而答案是正确的。
class Solution {
public:
string replaceSpace(string s) {
int len = 0;
for(char &c : s)
if(c == ' ') len += 3;
else len++;
int i = s.size(), j = len;
s.resize(len);
while(i >= 0)
{
if(s[i] == ' ')
{
s[j--] = '0';
s[j--] = '2';
s[j--] = '%';
}
else
s[j--] = s[i];
i--;
}
return s;
}
};