替换空格(Python and C++解法)
题目:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:
pyhon中有很多非常方便的替换操作,如:
1 return s.replace(' ', '%20') # 直接replace替换就行
1 s = s.split(" ") 2 return "%20".join(s)
1 strLen = len(s) 2 newStr = [] 3 for i in range(strLen): 4 if s[i] == " ": 5 newStr.append("%20") 6 else: 7 newStr.append(s[i]) 8 return ''.join(newStr) # ''.join()表示什么也不添加;如果没有该句,则返回的是一个列表
上述解法操作上很方便,但是涉及到了大量的字符重复搬移工作,且严格来说,题目需要自己实现一个函数实现该替换功能。
如果想降低复杂度,需要将所有的字符搬运次数降低为1次,时间复杂度变为O(n)。
方法是:先统计源字符串的长度L1和空格个数K,那么替换20%之后的新字符串长度L2 = L1 + 2*K。然后使用两个指针,一个P1指向源字符串的末尾,一个P2指向新字符串的末尾,逐个复制P1指向的字符给P2,直到P1遇到第一个空格,此时P1往前移一位,P2移动3位,插入20%。重复上述过程,直到两个指针相遇,代表空格已经插完。
Python解法:
1 class Solution: 2 def replaceSpace(self, s): 3 s_len = len(s) # 源字符串长度 4 n_space = 0 # 空格计数 5 if s is None or s_len == 0: 6 return "" 7 8 for i in range(s_len): # 统计空格数量 9 if s[i] == ' ': 10 n_space += 1 11 s_new_len = s_len + 2 * n_space # 新串的长度 12 13 if s_new_len == s_len: # 如果没有空格,直接返回源串 14 return s 15 s_new = [0] * s_new_len # 新串 16 17 while s_len >= 0 and s_new_len >= s_len: 18 if s[s_len-1] != ' ': 19 s_new[s_new_len - 1] = s[s_len - 1] 20 s_new_len -= 1 21 s_len -= 1 22 else: 23 s_len -= 1 24 s_new[s_new_len-1] = '0' 25 s_new_len -= 1 26 s_new[s_new_len-1] = '2' 27 s_new_len -= 1 28 s_new[s_new_len-1] = '%' 29 s_new_len -= 1 30 return ''.join(s_new)
C++解法:
1 class Solution { 2 public: 3 void replaceSpace(char *str, int length) { 4 if (str == NULL || length == 0) 5 return; 6 int spaceCount = 0; // 统计空格 7 int index = 0; // 由于不知所给的length识别包含'\0',所以实际统计一下字符 8 while (str[index] != '\0') { 9 if(str[index] == ' ') 10 spaceCount += 1; 11 ++index; 12 } 13 int oriLentg = index, newLength = oriLentg + 2 * spaceCount; 14 15 if(spaceCount == 0) 16 return; 17 18 while (oriLentg >= 0 && newLength >= oriLentg) { 19 if (str[oriLentg] != ' ') { 20 str[newLength] = str[oriLentg]; 21 oriLentg -= 1; 22 newLength -= 1; 23 } 24 else { 25 oriLentg -= 1; 26 str[newLength--] = '0'; 27 str[newLength--] = '2'; 28 str[newLength--] = '%'; 29 } 30 } 31 return; 32 } 33 };