剑指 Offer 05. 替换空格
题目
请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
限制:
0 <= s 的长度 <= 10000
思路一:StringBuilder拼接
循环s
字符串,判断每个字符是否 = ’ ',根据不同情况向StringBuilder中拼接即可,时间复杂度O(n),使用了额外空间StringBuilder,复杂度为O(n)
代码
public String replaceSpace(String s) {
if (s == null) {
return s;
}
StringBuilder sb = new StringBuilder();
for (int x = 0; x < s.length(); ++x) {
if (s.charAt(x) != ' ') {
sb.append(s.charAt(x));
} else {
sb.append("%20");
}
}
return sb.toString();
}
时间复杂度
O(n)
思路二:双指针
1、声明StringBuilder
,根据空格append
两个空格,最后得出的空格字符串 + 原字符串
就是返回字符串最终的长度,需要拼接的 ‘%20’
占三个字符,而原字符串已经存在一个空格,再加上StringBuilder
的双空格,所以得出以上结论。
2、定义双指针,left
指向原字符串结尾,right
指向最终字符串结尾,这样一来,left ~ right
指向的就是第一步StringBuilder
的空格子串。
3、利用双指针这里从后向前根据情况填充字符即可。
代码
public String replaceSpace02(String s) {
if (s == null || s.length() == 0) {
return s;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); ++i) {
if (s.charAt(i) == ' ') {
sb.append(" ");
}
}
if (sb.length() == 0) {
return s;
}
int l = s.length() - 1;
s += sb.toString();
int r = s.length() - 1;
char[] chars = s.toCharArray();
//这里从后向前填充
//从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。
while (l >= 0) {
if (chars[l] == ' ') {
chars[r--] = '0';
chars[r--] = '2';
chars[r] = '%';
} else {
chars[r] = chars[l];
}
l--;
r--;
}
return new String(chars);
}
时间复杂度
O(n)