剑指 Offer(第2版)面试题 5:替换空格
剑指 Offer(第2版)面试题 5:替换空格
题目来源:16. 替换空格
注意,书上的要求是原地修改字符串 str。
解法1:从前往后替换空格
代码:
class Solution
{
public:
string replaceSpaces(string &str)
{
for (int i = 0; i < str.size(); i++)
if (str[i] == ' ')
{
str.erase(i, 1);
str.insert(i, "%20");
}
return str;
}
};
复杂度分析:
时间复杂度:O(n2),其中 n 是字符串 str 的长度。遍历字符串要 O(n) 的时间,每次遇到空格,需要移动后面 O(n) 个字符,总的时间复杂度为 O(n2)。
空间复杂度:O(1)。
解法2:从后往前替换空格
设字符串长度为 len,遍历一次字符串 str,统计其中空格的个数,记为 space。
我们将字符串的每一个空格替换成 “%20”,替换后的字符串长度为 len + 2 * space。
我们从字符串的末尾开始复制和替换。首先准备两个指针 p1 和 p2,p1 指向原始字符串的末尾,p2 指向替换后字符串的末尾。向前移动 p1,有 2 种情况:
- p1 == ‘ ‘,p1 前移 1 格,在 p2 之前插入字符串 “%20”,p2 前移 3 格;
- 否则,p2 复制 p1 处的字符,p1 和 p2 都前移 1 格。
代码:
class Solution
{
public:
string replaceSpaces(string &str)
{
int len = 0, space = 0;
int i = 0;
while (str[i] != '\0')
{
len++;
if (str[i] == ' ')
space++;
i++;
}
int new_len = len + 2 * space;
str.resize(new_len);
int p1 = len, p2 = new_len;
while (p1 >= 0 && p2 > p1)
{
if (str[p1] == ' ')
{
str[p2--] = '0';
str[p2--] = '2';
str[p2--] = '%';
}
else
str[p2--] = str[p1];
p1--;
}
return str;
}
};
复杂度分析:
时间复杂度:O(n),其中 n 是字符串 str 的长度。
空间复杂度:O(1)。