替换空格

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%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 };

 

 

 

 

 

 

 

 

 

posted @ 2019-05-28 17:38  Austin_anheqiao  阅读(157)  评论(0编辑  收藏  举报