【题目描述】
【思路】
从头到尾遍历源字符串,遇到” “则在res字符串加上”%20”,否则原样拷贝。
时空皆为O(n)
class Solution {
public String replaceSpaces(StringBuffer str) {
String s = str.toString();
StringBuffer res = new StringBuffer();
for(int i = 0; i < s.length() ; i ++){
char c = s.charAt(i);
if( c == ' ') res.append("%20");
else res.append(""+c);
}
return res.toString();
}
}
使用Java 字符串自带的API
class Solution {
public String replaceSpaces(StringBuffer str) {
String s = str.toString();
return s.replace(" ","%20");
}
}
上述代码时空皆为O(n),使用双指针算法可以 使空间变为O(1),时间为O(n)。
双指针扫描
首先遍历原字符串,计算目标字符串的长度,然后setLength()对原字符串进行扩容。
i指向源字符串的最后一个字符,j指向字符串最后位置。从后往前遍历,遇到’ ‘则在j位置依次填充‘0’, ‘2’, ‘%’,否则原样拷贝。易知i是小于等于j的,所以str.charAt(j)并不会覆盖未被遍历的str.charAt(i),所以得到的字符串是正确的。
class Solution {
public String replaceSpaces(StringBuffer str) {
int len = 0;
//计算目标字符串长度
for(int i = 0; i < str.length(); i++){
if(str.charAt(i) == ' ') len += 3;
else len ++;
}
//双指针从后往前扫描 " We are happy. "
int i = str.length() - 1, j = len - 1;
str.setLength(len);//重新设置str的长度
for(; i>=0 && i <= j; i --){
char c = str.charAt(i);
if( c == ' ') {
str.setCharAt(j --, '0');
str.setCharAt(j --, '2');
str.setCharAt(j --, '%');
}else{
str.setCharAt(j --, c);
}
}
return str.toString();
}
}