剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
限制:
0 <= s 的长度 <= 10000
思路及代码
1.求出空格数
2.修改字符串s长度以容纳多出来的字符-->s.resize(s.size() + 2*空格数)
3.从后向前替换空格,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。
3.1当 s[i] 不为空格时:执行 s[j] = s[i] ;
3.2当 s[i] 为空格时:将字符串闭区间 [j-2, j] 的元素修改为 "%20" ;由于修改了 3 个元素,因此需要 j -= 2 ;
4. 返回s
一些问题:
为什么要从后向前填充,而不是从前向后填充?
从前往后每次都要移动添加位置后的元素,时间复杂度为O(n^2),而从后往前用双指针时,后面的指针在修改扩充的数组内容时,是不影响前面的指针遍历原数组的
Code:
class Solution {
public:
string replaceSpace(string s) {
int nums=0,len = s.size();
//统计空格个数
for(char c : s){
if(c == ' ') nums++;
}
//扩充长度
s.resize(s.length() + 2*nums);
//倒序双指针修改
for(int i = len-1,j=s.size()-1;i<j;i--,j--){
if(s[i] != ' ') s[j] = s[i];
else{
s[j] = '0';
s[--j] = '2';
s[--j] = '%';
}
}
return s;
}
};