剑指 Offer 05. 替换空格
题目描述:
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
限制:
0 <= s 的长度 <= 10000
题目地址
C++代码
这道题如果开辟额外的空间思路很简单,这里主要讨论一下对于直接在原字符串空间进行替换并且时间复杂度较低的思路方法!
如果按照常规想法,把字符串从头开始扫描,遇到空格后把空格后面所有的字符全部后移两位,则很多后面的字符会被多次后移,导致整体的时间复杂度为O(n^2),所以要想减小时间复杂度,更好的思路是:先遍历一遍字符串,统计空格的数量count,之后字符串后面扩容2 * count 个空间,之后借助双指针方法从字符串后面往前复制和替换字符,两个指针最开始相距 2 * count的位置,直至两个指针相遇,说明所有空格替换完成!
class Solution {
public:
string replaceSpace(string s) {
int length = s.size();
int count = 0;
for(auto &c : s){
if(c == ' ') ++count;
}
s.resize(length + 2 * count);
for(int i = length-1, j = s.size()-1;i < j;--i, --j){ //双指针,i指向原来数组的最后位置,j指向扩展长度后数组的最后一位
if(s[i] == ' '){
s[j--] = '0';
s[j--] = '2';
s[j] = '%';
}
else{
s[j] = s[i];
}
}
return s;
}
};
时间复杂度:O(n)
总结
这个题目看似很基础,但是很考验基本是否扎实,包括字符串容器的resize()扩容,优化算法的思路!
欢迎大家扫码关注本人公众号:编程复盘与思考随笔
(关注后可以免费获得本人在csdn发布的资源源码)
公众号主要记录编程和刷题时的总结复盘笔记和心得!并且分享读书、工作、生活中的一些思考感悟!
想要组队一起参加阿里天池,kaggle,百度飞浆,科大讯飞等AI相关的比赛的同学可以扫下面的二维码加微信一起讨论学习!