请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
限制:
0 <= s 的长度 <= 10000
这道题题意很简单,就是替换所有的空格,不过不是等量替换,而是将一个字符替换成三个字符,如果是c语言的话,就要重新分配新的空间,而且后面的字符要全部后移,难点就来了,如果直接从前到后遍历,遍历到一个空格就扩展一次,后移一次,替换一次。
当然解出题肯定可以解出来,但是不一定能拿到offer,因为这种解法在一个字符串中每次替换都要移动O(n)大小的字符,所以在一个字符串中有O(n)个空格的情况下,时间复杂度就会大到O(n^2)
作者给出的解法是双指针法,先遍历一遍字符串,找出所有的空格,然后×2就是扩展的字符串的大小,扩展好之后,将字符串中两个指针从后往前扫描,前指针发现非空格,就复制这个字符到后指针的位置,并且双向前移,当前指针发现空格时,后指针就向前写%20这三个字符,依次这样下去。
当然python是有对应的库函数的replace,字符串也没有大小限制,当然为了顺应面试官的想法,也可以用python模仿下作者的双指针解法。
题解一:库函数replace替换法
def replaceSpace(self, s):
"""
:type s: str
:rtype: str
"""
return s.replace(" ","%20")
题解二:双指针遍历法
def replaceSpace(self, s):
"""
:type s: str
:rtype: str
"""
if len(s) == 0:
return s
len_space = 0
s = list(s)
for i in range(len(s)):
if s[i] == " ":
len_space = len_space + 1
if len_space == 0:
pass
else:
pre = len(s) - 1
for i in range(len_space):
s.append(" ")
s.append(" ")
low = len(s) - 1
while(pre >= 0 and low >= 0):
if s[pre] == " ":
s[low] = "0"
s[low-1] = "2"
s[low-2] = "%"
low = low - 3
pre = pre - 1
continue
elif s[pre] != " ":
s[low] = s[pre]
pre = pre - 1
low = low - 1
continue
return "".join(s)