【剑指 Offer】005. 替换空格
题目描述
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."限制:
0 <= s 的长度 <= 10000
方法一:从前往后,O(N^2)
从前往后遍历,遇到空格替换成 '%20',由于 C++ 字符串可以修改,C++ 此时需要 O(N^2),遍历 O(N)移动 O(N),而 python 和 java 字符串是不能修改的,需要 O(N) 额外空间。
// C++
string replaceSpace(string s)
{
string res;
for(auto c : s)
{
if(c == ' ')
{
res.push_back('%');
res.push_back('2');
res.push_back('0');
}else
res.push_back(c);
}
return res;
}
def replaceSpace(s: str) -> str:
res = []
for c in s:
if c == ' ':
res.append('%')
res.append('2')
res.append('0')
else:
res.append(c)
return ''.join(res)
方法二:从后往前遍历,O(N)
主要思想:先遍历一遍统计字符串有多少空格,再对字符串扩容后从后往前遍历,同时交换字符位置或增添'%20'替换空格。
// C++
string replaceSpace2(string s)
{
int count = 0, len = s.size();
for (char c : s)
{
if (c == ' ')
count++;
}
s.resize(len + 2 * count);
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 - 1] = '2';
s[j - 2] = '%';
j -= 2;
}
}
return s;
}