替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1

1
2
**输入**:s = "We are happy."
输出:"We%20are%20happy."

限制:

0 <= s 的长度 <= 10000

解法

1
2
3
class Solution:
    def replaceSpace(self, s: str) -> str:
        return s.replace(' ','%20')
1
2
3
4
5
6
7
class Solution:
    def replaceSpace(self, s: str) -> str:
        res = []
        for c in s:
            if c == ' ': res.append("%20")
            else: res.append(c)
        return "".join(res)

思路

遍历添加

算法流程

  • 初始化一个 list (Python) / StringBuilder (Java) ,记为 res;
  • 遍历列表 s 中的每个字符 c: 1.当 c 为空格时:向 res 后添加字符串 “%20”; 2.当 c 不为空格时:向 res 后添加字符 c;
  • 将列表 res 转化为字符串并返回。

复杂度分析

  • 时间复杂度 O(N): 遍历使用 O(N) ,每轮添加(修改)字符操作使用 O(1);
  • 空间复杂度 O(N): Python 新建的 list 和 Java 新建的 StringBuilder 都使用了线性大小的额外空间。

原地修改

在 C++ 语言中, string 被设计成「可变」的类型(参考资料)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
    string replaceSpace(string s) {
        int count = 0, len = s.size();
        // 统计空格数量
        for (char c : s) {
            if (c == ' ') count++;
        }
        // 修改 s 长度
        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 - 2] = '%';
                s[j - 1] = '2';
                s[j] = '0';
                j -= 2;
            }
        }
        return s;
    }
};