字符串替換
一、字符串的替換【倒着復制】
原問題思路:
-
- 遍歷第一遍:得到兩個信息,chas的左半區有多大,記為len,左半區的空格有多少,記為num。
可知最終長度為len+2*num,替換字母為%20.
-
- 從右往左遍歷第二遍:遇到字母復制到新長度最后位置,遇到空格則加入02%。
原問題代碼:
def changeStr(s): if not s: return s count = 0 n = len(s) for i in range(n): if s[i] == ' ': count += 1 m = n + count * 2 s += '0'*(count*2) j = 0 for i in range(n-1,-1,-1): tmp = m - j -1 if s[i] != ' ': s = s[:tmp] + s[i] + s[tmp+1:] j += 1 else: s = s[:tmp-2]+'%20'+s[tmp+1:] j += 3 return s s = 'AB C DEF G' print(changeStr(s))
二、移動字符【倒着復制】
補充問題思路:
從右往左倒着復制,遇到數字直接復制,遇到*不復制,當把所有數字復制完,把左半區全部設置成*即可。
代碼:
def sortStr(s): if not s: return s j = 0 n = len(s) for i in range(n-1,-1,-1): tmp = i + j if s[i] != '*': s = s[:tmp] + s[i] + s[tmp+1:] else: j += 1 s = '*'*j + s[n-j-1:] return s s = '123**24**2*' print(sortStr(s))
三、替換字符串中連續出現的指定字符串
六、替換字符串中連續出現的指定字符串
給定三個字符串str、from和to,已知from字符串中無重復字符,把str中所有from的子串全部替換成to字符串,對連續出現from的部分要求只替換成一個to字符串,返回最終的結果字符串
舉例:
str="123abc",from="abc",to="4567",返回"1234567"
str="123",from="abc",to="456",返回"123"
str="123abcabc",from="abc",to="X",返回"123X"
思路:
先將str中含from的都替換成0*len(from),然后將不等於0的用cur暫存,遇到0則 res + cur + to。
把str看作字符類型的數組,首先把str中from部分所有位置的字符編碼設為0(即空字符),如"12abcabca4",from="abc",處理后str=['1','2',0,0,0,0,0,0,'a','4']。
具體步驟如下:
1 生成整數變量match,標識目前匹配到from字符串的什么位置,初始時match=0;
2 從左到右遍歷str中每個字符,假設當前遍歷到str[i];
3 若str[i]==from[match],若match是from最后一個字符的位置,說明在str中發現了from字符串,則從i位置向前的M個位置,都把字符編碼設為0,M為from的長度,設置完成后令match=0;若match不是from最后一個字符的位置,則match++。繼續遍歷str的下一個字符;
4 若str[i]!=from[match],說明匹配失敗,令match=0,即回到from開頭重新匹配。繼續遍歷str的下一個字符;
代碼:
def replace(s,f,to): if not s or f == None: return s arr = list(s) j = 0 for i in range(len(s)): if s[i] == f[j]: if j == len(f)-1: s = s[:i-j] + '0' * len(f) + s[i+1:] # s[i-j+1:i+1] = '0' * len(f) j = 0 else: j += 1 else: j = 0 res = '' cur = '' for i in range(len(s)): if s[i] != '0': cur = cur + s[i] if s[i] == '0' and (i == 0 or s[i-1] != '0'): res = res + cur + to cur = '' if cur: res = res + cur return res s = '12abcabc3' f = 'abc' to = 'X' replace(s,f,to)
四、去掉字符串中連續出現k個0的子串
給定一個字符串str和一個整數k,如果str中正好有連續的k個'0'字符出現時,把k個連續的'0'字符去除,返回處理后的字符串。
舉例:
str="A00B",k=2,返回"AB";
str="A0000B000",k=3,返回"A0000B"。
思路:
采用count記錄連續0的個數,若count==k,則將str連續的0刪除。
代碼:
def removeKzeros(arr,k):
if not arr or k == 0:
return arr
count , i = 0 , 0
while i < len(arr):
if arr[i] != '0':
i += 1
while i < len(arr) and arr[i] == '0':
count += 1
i += 1
if count and count == k:
arr = arr[:i-count]+arr[i:]
count = 0
return arr
arr = 'A00B'
k = 2
removeKzeros(arr,k)
arr="A0000B000"
k=3
removeKzeros(arr,k)