替换空格
题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
python:
1 # -*- coding:utf-8 -*- 2 class Solution: 3 # s 源字符串 4 # s.replace 之后原始的字符串并不改变,所以要将s.replace重新赋予一个新变量 5 def replaceSpace(self, s): 6 # write code here 7 s1 = s.replace(' ','%20') 8 return s1
1 # -*- coding:utf-8 -*- 2 class Solution: 3 # s 源字符串 4 def replaceSpace(self, s): 5 # write code here 6 ls = list(s) 7 length = len(ls) 8 for i in range(length): 9 if ls[i]==' ': 10 ls[i] = '%20' 11 return ''.join(ls)
c++
从字符串第一个字符开始往后搜索,一旦遇到空格,那么就先把这个空格之后的所有字符往后移动两位,然后把空格替换,然后继续往后搜索,直到所有空格都替换完毕,我们来算一下时间复杂度,每替换一次空格我们都要将后面所有空格都移动,每一次移动都是O(n),所以移动n次,时间复杂度为O(n^2)。
传统的思路就会发现移动次数太多,为啥多呢?一个字符串由多个空格隔成了好多个部分,越靠前的部分需要移动的位数就越小(最小为2,不算第一个部分),越靠后的部分需要移动的位数就越大(2*n),传统思路是从前往后替换的,也就是靠后的部分受制于靠前的部分,所以靠后的部分会移动n次,总体移动次数相当于计算n+(n-1)+.....+2+1,自然是O(n^2).
那么当务之急就是降低移动次数,我们把从前往后替换变成从后往前替换,如下图:
那么靠后的部分一下子就移动了2n位,挨个往前,各个部分都不墨迹,直接移动2n位,所以总体移动次数相当于计算1+1+....+1=n,时间复杂度一下子就降到了O(n)。
我们用两个标记p1和p2,开始分别标记原字符串的末尾和新字符串的末尾,前提是你的原字符串后边的空间是充足的,我把字符数组初始化为100个字符大小,然后随着搜索空格和替换往前移动,下面的图表示的很清晰:
1 class Solution { 2 public: 3 void replaceSpace(char *str,int length) {//字符数组和数组长度(包括'\0') 4 if(str==NULL) return; 5 int count_blank=0;//空格的数目 6 int origin_length=0;//替换前字符的个数,包括空格,不包括'\0' 7 int final_length=0;//替换后字符的个数,不包括'\0' 8 for(int i=0;str[i]!='\0';i++){ 9 origin_length++; 10 if(str[i]==' ') count_blank++; 11 } 12 final_length=origin_length + 2*count_blank; 13 //判断字符数组是否越界,因为数组在最初的时候就给定了长度,他不想vector能自动调节长度 14 if(final_length+1 > length) return ; 15 //开始替换空格 16 char* p1 = str + origin_length;//指向原始字符串数组末尾的'\0' 17 char* p2 = str + final_length;//指向最终字符串数组末尾的'\0' 18 while(p1!=p2){ 19 if(*p1==' '){ 20 *p2--='0';//--优先级高于* 21 *p2--='2'; 22 *p2--='%'; 23 } 24 else{ 25 *p2--=*p1; 26 } 27 p1--; 28 } 29 } 30 };