题目描述:
请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。给定一个string iniString 为原始的串,以及串的长度 int len, 返回替换后的string。
测试样例: "Mr John Smith”,13 返回:"Mr%20John%20Smith"
”Hello World”,12 返回:”Hello%20%20World”
思路一:
首先想到的是另外新建一个字符串,将原有字符串依次顺序遍历复制到新建字符串中,如果遇到空格,则复制三个字符“%20”,这样多出两个字符,每遇到一个空格就多两个字符,所以如果是字符串数组的情况下,需要先遍历一次原字符串,求出空格个数,然后新建字符串的总长度=原字符串的长度+空格个数*2,这样可以顺序遍历实现替换。
这样时间上只需要遍历两次字符串,空间却需要多一份拷贝。
思路二:
如果容许修改原字符串的情况下,可以在原字符串通过移动字符实现,我们普通的想法是从第一个字符开始移动,那么每遇到一个空格,字符串后面的部分就要整体往后移动两个字符,那么时间复杂度为O(N*N),显然不是理想的做法。
换一个角度想,如果从最后一个字符开始移动,首先统计好空格的个数,那么最后一个字符对应的移动位置就确定了,那么没个字符只需要移动一次,这样的时间复杂度为O(N),空间上也会少 一份拷贝,从空间和时间的角度出发,都是最优的。
代码实现如下:
string replaceSpace(string iniString, int length) {
// write code here
if(iniString.empty()||length<=0)
return string();
int spaceNum=0;
for(int i=0;i<length;++i)
{
if(iniString[i]==' ')
++spaceNum;
}
iniString.resize(length+spaceNum*2);
int i=length+spaceNum*2-1;
for(int j=length-1;j>=0;--j)
{
if(iniString[j]==' ')
{
iniString[i]='0';
iniString[i-1]='2';
iniString[i-2]='%';
i=i-3;
}
else
iniString[i--]=iniString[j];
}
return iniString;
}