时空要求
- 时间限制:1秒
- 空间限制:32768K
- 热度指数:795549
- 本题知识点: 字符串
题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解题思路
思路一
顺序遍历字符串并复制相应的字符到新的字符串中。时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n).
python实现
# -*- coding:utf-8 -*-
class Solution:
# s 源字符串
def replaceSpace(self, s):
# write code here
s_re = ''
for char in s:
if char == ' ':
s_re += '%20'
else:
s_re += char
return s_re
- 运行时间:29ms
- 占用内存:5864k
python
可以利用list
减小空间复杂度,即不需要开辟一个新的空间,直接在原字符串中插入。
# -*- coding:utf-8 -*-
class Solution:
# s 源字符串
def replaceSpace(self, s):
# write code here
s = list(s)
length = len(s)
for i in range(length):
if s[i] == ' ':
s[i] = '%20'
s = ''.join(s)
return s
- 运行时间:28ms
- 占用内存:5700k
# -*- coding:utf-8 -*-
class Solution:
# s 源字符串
def replaceSpace(self, s):
# write code here
s = s.replace(' ', '%20')
return s
- 运行时间:27ms
- 占用内存:5736k
思路二
例:I am a student.
区别于第一种思路,该方法不需要另外开辟新的字符串来实现,而是通过插入移动的方法来实现。插入有两种实现方式,一种是从前面插入,一种是从后面插入。如果从前面插入,那么第一次需要移动13个字符,第二次需要移动10个字符,第三次需要移动8个字符,一共需要移动13+10+8=31次。时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。如果从后面插入,第一次需要移动8个字符,第二次需要移动1个字符,第三次需要移动2个字符,一共需要移动8+1+2=11次。时间复杂度为
O
(
n
)
O(n)
O(n)。
由于Python的字符串是不可变的,因此需要先转成list再进行操作。
python实现
# -*- coding:utf-8 -*-
class Solution:
# s 源字符串
def replaceSpace(self, s):
# write code here
s = list(s)
count = 0
for char in s:
if char == ' ':
count += 1
for i in range(count):
s.append('11')
s.append('11')
for i in range(len(s)-1, -1, -1):
if s[i] != ' ':
s[i+2*count] = s[i]
else:
count -= 1
s[i+2*count] = '%'
s[i+2*count+1] = '2'
s[i+2*count+2] = '0'
s = ''.join(s)
return s
C++实现
class Solution {
public:
void replaceSpace(char *str,int length) {
int count=0;
for(int i=0; i<length; i++)
if(str[i]==' ')
count++;
for(int i=length-1; i >=0; i--)
if(str[i]!=' ')
str[i+2*count]=str[i];
else{
count--;
str[i+2*count]='%';
str[i+2*count+1]='2';
str[i+2*count+2]='0';
}
}
};
- 运行时间:6ms
- 占用内存:616k