LeetCode 剑指 Offer 05. 替换空格
题目描述

给定一个字符串,逐个替换字符串中的空格为
%20。请注意,返回的字符串应该是一个新的字符串,原字符串不变。示例 1:
输入:
s = "We are happy."
输出:"We%20are%20happy."示例 2:
输入:
s = " Hello World! "
输出:"Hello%20World!"提示:
- 0 <= s.length <= 10000
题意分析
将输入中的每一个普通空格字符替换成三个字符
%20,其他字符原样保留,返回新字符串,原字符串不变。首尾空格和连续空格都属于输入内容,不能删除或合并。题目描述中的示例 2 漏掉了首尾空格的替换:输入
" Hello World! "按规则应得到"%20Hello%20World!%20"。这里以逐个替换全部空格的题意为准,原示例保留供对照。
解法:一次遍历构造新字符串
核心思路
[!blue]
每个输入字符的输出只由它自己决定,不依赖左右字符:空格对应
%20,其他字符对应自身。因此从左到右扫描,每次向结果缓冲区追加这一字符对应的内容即可,无需回看或修改已生成部分。扫描到某个位置前,缓冲区恰好是已处理前缀的完整替换结果。追加下一字符的对应内容后,这个性质继续成立;遍历结束,缓冲区就是整个输入的结果。逐个处理也自然保留连续空格的数量与首尾内容。
Java 使用
StringBuilder,Go 使用可增长的字节切片,避免每次拼接都复制整个已有字符串。Go 只识别空格字节,其他字节按原顺序复制,不会改写它们的内容。若原长度为
n、空格数为c,输出长度是n + 2c,最多为3n。初始只预留输入长度也可以,缓冲区按需扩容;这是容量预留,不是先放入n个输出字符。
解题步骤
- 创建长度为空、容量可增长的结果缓冲区。
- 从左到右检查输入,遇普通空格追加
%20,否则追加原字符或原字节。- 不对输入执行去首尾空白或按空格分词操作。
- 将缓冲区转换为字符串返回;空输入自然得到空结果。
代码实现
class Solution {
public String replaceSpace(String s) {
StringBuilder builder = new StringBuilder(s.length());
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == ' ') {
// 每个空格独立替换,首尾与连续空格也不省略。
builder.append("%20");
} else {
builder.append(c);
}
}
return builder.toString();
}
}
func replaceSpace(s string) string {
// 预留容量但长度从零开始,所有输出都通过追加写入。
res := make([]byte, 0, len(s))
for i := 0; i < len(s); i++ {
if s[i] == ' ' {
// 每个空格独立替换,首尾与连续空格也不省略。
res = append(res, '%', '2', '0')
} else {
res = append(res, s[i])
}
}
return string(res)
}
复杂度分析
- 时间复杂度:$O(n)$,每个输入位置最多输出三个字符。
- 空间复杂度:$O(n)$,结果缓冲。
关键点总结
[!green]
- 替换的是每个普通空格字符,不是删除空白或做完整的 URL 编码。
- 首尾与连续空格采用同一规则,原有的其他内容逐个原样复制。
- 输出缓冲只向末尾追加,已处理前缀始终对应完整替换结果。
- 容量与长度不同,预留容量不应让结果预先包含无效字符。
易错点总结
[!yellow]
- 先去首尾空白或分词再拼接,会丢掉本题要求替换的首尾及连续空格。
- 把制表符等其他空白也统一当作普通空格,会扩大替换范围。
- 将缓冲区容量当作已有长度使用,可能在结果前留下默认内容。
- 在不可变字符串上反复拼接,会反复复制已有前缀,增加时间开销。
- 输出应遵循替换规则,不能照抄题目描述中遗漏首尾替换的第二个示例。
相似题目
| 题目 | 难度 | 关联与区别 |
|---|---|---|
| 面试题 01.03. URL化 | 简单 | 原题额外给真实长度,尾部预留区不属于内容;本题处理整个输入字符串。转成字符数组后,才可对照从后往前扩写的方法。 |
| 1089. 复写零 | 简单 | 同样一个输入元素扩成多个输出元素,但复写零受固定长度截断,本题替换空格不应丢字符。 |
转载与许可
许可
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!