字符串空格替换
题目:实现一个函数,把字符串中的每一个空格替换为“%20”,eg:we are happy 替换为 we%20are%20happy
由原来一个空格字符,替换之后变成%,2,0三个字符,因此替换之后的字符串会变长
此时需要考虑是否在原字符串基础上进行修改
- 如果不考虑内存空间是否充足,可以直接考虑再开辟一块空间进行新字符串存放,基于C++STL模板类直接进行遍历,遇到空格替换添加至新串即可,代码如下:
class Replacement {
public:
string replaceSpace(string iniString, int length) {
// write code here
string newStr;
for (int i = 0; i < length; i++){
if (iniString[i] == ' '){
newStr.push_back('%');
newStr.push_back('2');
newStr.push_back('0');
}
else{
newStr.push_back(iniString[i]);
}
}
return newStr;
}
};
- 如果考虑在原字符串基础上进行修改,需要先对原字符串进行扩容,扩容之后,如果从头到尾进行遍历。每一次替换都会导致后续字符被覆盖,对此需要不断向后移动替换位置之后的字符
- 如果选择逐个从后往前遍历依次赋值,时间复杂度将会从O(n^2)缩减到O(n)
- 代码如下:
class Replacement {
public:
string replaceSpace(string iniString, int length) {
if(length<=0)
return iniString;
int blank = 0;
for(int i=0;i<length;++i)
if(iniString[i]==' ')
++blank;
int newLength = length+(blank*2);
iniString.resize(newLength);
int index1 = length-1;//指向原字符串结尾
int index2 = newLength-1;//指向新字符串结尾
while(index1>=0 && index2>index1){
if(iniString[index1]==' '){
iniString[index2--]='0';
iniString[index2--]='2';
iniString[index2--]='%';
}
else
iniString[index2--]=iniString[index1];
--index1;
}
return iniString;
}
};
- 如果考虑在原字符串基础上进行修改,除了扩容使用resize之外,可以通过STL特性进行编写,代码更加简洁高效,代码如下:
class Replacement {
public:
string replaceSpace(string iniString, int length) {
if(length<=0)
return iniString;
//STL模板string特性
for(int i=0;i<length;i++)
{
if(iniString[index1]==' '){
iniString.erase(i,1);
iniString.insert(i,"%20");
}
}
return iniString;
}
};