字符串的替換


字符串替換

 

一、字符串的替換【倒着復制】

原問題思路:

    • 遍歷第一遍:得到兩個信息,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)
復制代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM