替换空格
题目:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
限制:
0 <= s 的长度 <= 10000
解题思路
看到题目我们先想到最暴力的解法就是通过遍历整个字符串来找到每一个空格,然后将每一个空格替换成%20。但是由于题目限定了字符串的大小,所以考虑到算法的时间复杂度,这种方法效果太差。
然后想到了利用C++中stl现有的查找和替换算法来进行实现。find函数和replace函数定义如下图所示。
我们先通过find函数从字符串开始位置往后找到第一个空格处,然后进入循环进行替换,利用replace函数完成替换。当找到字符串末尾时,退出循环,返回替换后的字符串。
代码展示
代码如下(示例):
class Solution {
public:
string replaceSpace(string s) {
//从字符串起始位置找到第一个空格处,返回起位置给pos
size_t pos=s.find(" ",0);
//循环条件是不超过整个字符串长度
while(pos<s.size())
{
//利用replace函数替换空格
s.replace(pos,1,"%20");
//让pos指向下一个空格处
pos=s.find(" ",pos);
}
//返回替换过后的字符串
return s;
}
};
运行结果
可以看到算法虽然通过了,但是效果并不是太好。
*执行用时:4 ms, 在所有 C++ 提交中击败了35.36%的用户* *内存消耗:6.4 MB, 在所有 C++ 提交中击败了28.94%的用户*优化解法:双指针法
先通过遍历统计出字符串中空格的总数,然后将字符串总长度追加上空格总数的两倍(“ ”变为“%20”增加了空格数两倍的长度)。再让j指向原字符串长度,i指向新字符串长度。当j指向的字符不是空格时,则将j指向的字符赋值给i指向字符。当j指向的字符是空格时,则将i指向的字符改为0,i-1指向的换为2,i-2指向的换为%,然后将i移到i-2处。然后一直循环,直到j<i不成立时退出循环并返回替换后的字符串。
代码展示
代码如下(示例):
class Solution {
public:
string replaceSpace(string s) {
int count = 0; // 统计空格的个数
int sOldSize = s.size();
for (int i = 0; i < s.size(); i++) {
if (s[i] == ' ') {
count++;
}
}
// 扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小
s.resize(s.size() + count * 2);
int sNewSize = s.size();
// 从后先前将空格替换为"%20"
for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
if (s[j] != ' ') {
s[i] = s[j];
} else {
s[i] = '0';
s[i - 1] = '2';
s[i - 2] = '%';
i -= 2;
}
}
return s;
}
};
运行结果
可以看到算法通过了,而且效果比较理想。
*执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户* *内存消耗:6.5 MB, 在所有 C++ 提交中击败了8.78%的用户*