1题目描述:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
2.解题思路
对于这个题目,我们首先想到原来的一个空格替换为三个字符,字符串长度会增加,因此,存在以下两种不同的情况:(1)允许创建新的字符串来完成替换。(2)不允许创建新的字符串,在原地完成替换。
第一种情况比较简单。对于第二种情况,有以下两种解法:
- 时间复杂度为O(n^2)的解法。
从头到尾遍历字符串,当遇到空格时,后面所有的字符都后移2个。
- 时间复杂度为O(n)的解法。
可以先遍历一次字符串,这样可以统计出字符串中空格的总数,由此计算出替换之后字符串的长度,每替换一个空格,长度增加2,即替换之后的字符串长度为原来的长度+2*空格数目。接下来从字符串的尾部开始复制和替换,用两个指针P1和P2分别指向原始字符串和新字符串的末尾,然后向前移动P1,若指向的不是空格,则将其复制到P2位置,P2向前一步;若P1指向的是空格,则P1向前一步,P2之前插入%20,P2向前三步。这样,便可以完成替换,时间复杂度为O(n)。
3.编程实现(Java):
public class replaceSpace_42 {
//第一种情况:创建新的字符串实现:
public String replaceSpace(StringBuffer str) {
String res = "";
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c == ' ')
res += "%20";
else
res += c;
}
return res;
}
//第二种情况:原地替换,O(n)的解法
public String replaceSpace(StringBuffer str) {
if (str == null)
return null;
int len = str.length();
int numOfBlank = 0;
for (int i = 0; i < len; i++) {
if (str.charAt(i) == ' ')
numOfBlank++;
}
str.setLength(len + 2 * numOfBlank);
int oldIndex = len - 1;
int newIndex = (len + 2 * numOfBlank) - 1;
while (newIndex > oldIndex && oldIndex >= 0) {
char c = str.charAt(oldIndex);
if (c == ' ') {
oldIndex--;
str.setCharAt(newIndex--, '0');
str.setCharAt(newIndex--, '2');
str.setCharAt(newIndex--, '%');
} else {
str.setCharAt(newIndex--, c);
oldIndex--;
}
}
return str.toString();
}
}