剑指 Offer 05. 替换空格
题目描述
难度:简单
描述
请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
示例
现有矩阵 matrix 如下:
输入:s = "We are happy."
输出:"We%20are%20happy."
限制:
0 <= s 的长度 <= 10000
函数签名:
string replaceSpace(string s);
解法一
第一种思路是创建一个新的空字符串,遍历原字符串,判断当前字符是否是空格,如果是空格,新串 += "%20"
如果不是空格,新串加 += 当前字符
代码过于简单,就不展示啦。
时间复杂度 : O(N)
空间复杂度 : O(N)
。
解法二
第二种思路是原地调整字符串大小,直接将"%20"
加入到原字符串中。
我们需要遍历一次数组,统计空格字符出现的次数,那么调整后的字符串大小应该等于old_size + 2*space_num
。
string replaceSpace(string s) {
int space_num = 0;
int size_old = s.size(); //旧串大小
for(char c:s)
if(isspace(c))
space_num++;
int size_new = size_old + 2 * space_num; //新串大小
s.resize(size_new);
int i = size_new-1;
int j = size_old-1;
while(i != j){ //如果 i==j,说明再前面的字符串子串里不存在空格字符,剪枝操作
if(isspace(s[j])){
s[i] = '0';
s[i-1] = '2';
s[i-2] = '%';
i -= 3;
j -= 1;
}
else{
s[i] = s[j];
j--;
i--;
}
}
return s;
}
时间复杂度 : O(N)
, 空间复杂度 : O(N)
。
这里的空间复杂度明显要比前一种小很多,尤其是字符串很长而空格字符很少的情况。如果形式参数是传引用的形式传递,应该采用解法一,尽量不改变传入的字符串。