题目描述
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
(进阶:不使用额外的内存空间)
示例 1:输入:s = “We are happy.”
输出:“We%20are%20happy.”
限制: 0 <= s 的长度 <= 10000
方法一(一行代码实现)
1.解题思路
利用java的replace()方法
2.代码实现
class Solution {
public String replaceSpace(String s) {
return s.replace(" ","%20");
}
}
3.复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)
方法二(遍历添加)
1.解题思路
新建一个StringBuilder或者StringBuffer,遍历整个字符串,当前字符为空格时,添加"%20";不是空格时,直接添加原字符。
2.代码实现
class Solution {
public String replaceSpace(String s) {
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.length();i++){
if(s.charAt(i)==' '){
sb.append("%20");
}
else{
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}
3.复杂度分析
- 时间复杂度:由于要遍历整个字符串,复杂度为O(n)
- 空间复杂度:额外创建了一个StringBuilder,复杂度为O(n)
方法三(原地修改)
1.解题思路
剑指offer书上本题的最佳解法是原地修改,因为C++语言中,String类型数据是可变的,所以可以直接在原字符串上修改。
我们可以先推算出原字符串修改后的长度,假设原字符长度为len,空格数为count,则修改后的字符串长度为len+2count,所以可以先直接设置字符串长度为len+2count。然后定义两个游标,一个负责遍历字符串,一个负责填充为变化后的字符串。(需要从后往前遍历,从前往后会改变后面为空格的位置)
2.代码实现
C++实现:
class Solution {
public:
string replaceSpace(string s) {
int count = 0, len = s.size();
int indexOfOld=len-1;
// 统计空格数量
for (char c : s) {
if (c == ' ') count++;
}
// 修改 s 长度
s.resize(len + 2 * count);
int indexOfNew=s.size()-1;
// 倒序遍历修改
for(int indexOfOld = len - 1; indexOfOld >= 0; indexOfOld--) {
if (s[indexOfOld] != ' ')
s[indexOfNew--] = s[indexOfOld];
else {
s[indexOfNew--] = '0';
s[indexOfNew--] = '2';
s[indexOfNew--] = '%';
}
}
return s;
}
};
java实现:
class Solution {
public String replaceSpace(String s) {
int len=s.length();
int indexOfOld=len-1;
for(int i=0;i<s.length();i++){
if(s.charAt(i)==' '){
len+=2;
}
}
int indexOfNew=len-1;
StringBuilder sb=new StringBuilder();
sb.setLength(len);
while(indexOfOld>=0){
if(s.charAt(indexOfOld)==' '){
sb.setCharAt(indexOfNew--,'0');
sb.setCharAt(indexOfNew--,'2');
sb.setCharAt(indexOfNew--,'%');
}
else{
sb.setCharAt(indexOfNew--,s.charAt(indexOfOld));
}
indexOfOld--;
}
return sb.toString();
}
}
3.复杂度分析
- 时间复杂度:由于要遍历整个字符串,复杂度为O(n)
- 空间复杂度:如果是C++实现,复杂度为O(1);如果是java实现,因为要新建StringBuilder来构建新的String,所以复杂度为O(n)
剑指offer全集入口: 请戳这里