文章目录
1. 题目描述
描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
2. 题目解析
2.1 考察问题
本问题考察的是字符串转数组,遍历,替换操作。
字符串本身可以看作是字符数组,但是字符串作为java和python语言的基本数据结构,有这比较成熟的操作方法,这些方法可以使用来简化字符串的操作。
当然,如果你对字符串操作方法不熟悉,那么问题处理起来就麻烦了。不过如果你想着直接用replace方法,也不是不可以,但肯定不是这个问题要考察的内容。
2.2 解决方法
- 新建字符串数组,遍历替换添加
新建一个字符串数组,遍历每个元素,是空格则替换,最终join连接成为新的字符串返回。
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n) - 原地替换
对于java而言,StringBuffer是可以实现的,因为StringBuffer对象支持动态扩容,设置length。首先遍历原字符串,计算替换完成后的长度,然后扩展原字符串长度(setLength),最后从后往前遍历替换添加。
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)
但是对于python而言,字符串定义为常量类型,不支持动态修改,仅支持遍历查找操作,因此必须使用方法1,新建字符串遍历替换添加。
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n) - 使用字符串内建函数
代码简洁,投机取巧,肯定不是正确答案。而且对于python而言,replace方法返回新建字符串,这也证实了方法2原地替换对于python而言是做不到的。
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)
2.3 优化分析
这个问题对于python而言没什么优化方法,就是遍历替换添加,python字符串不支持动态修改。
3. 代码实现
3.1 新建字符串数组,遍历替换添加
class Solution:
# s 源字符串
def replaceSpace(self, s):
# write code here
list_str = [] ### 也可以直接是string,然后 +
for i,c in enumerate(s):
if (c == ' '):
list_str.append("%20")
else:
list_str.append(c)
return "".join(list_str)
3.2 原地替换 (Java实现)
public class Solution {
public String replaceSpace(StringBuffer str) {
if (str == null) {
return null;
}
int length = str.length();
int indexOfOriginal = length-1;
for (int i = 0; i < str.length(); i++) {//从前往后遍历计算替换后的字符串长度
if (str.charAt(i) == ' ')
length += 2;
}
str.setLength(length); //动态扩展字符串长度
int indexOfNew = length-1;
while (indexOfNew > 0) {//从后往前遍历替换
if (str.charAt(indexOfOriginal) != ' ') {
str.setCharAt(indexOfNew--, str.charAt(indexOfOriginal));
} else {
str.setCharAt(indexOfNew--, '0');
str.setCharAt(indexOfNew--, '2');
str.setCharAt(indexOfNew--, '%');
}
indexOfOriginal--;
}
return str.toString();
}
}
3.3 字符串內建函数
class Solution:
# s 源字符串
def replaceSpace(self, s):
return "%20".join(list(s.split(" ")))
class Solution:
# s 源字符串
def replaceSpace(self, s):
return s.replace(' ','%20')
4. 思考
字符串操作在计算机编程过程中极其常用,为了更好的解决字符串相关问题,很有必要对不同语言常用的字符串操作进行一个简要的总结。