字串壓縮演算法(騰訊筆試題)

2021-10-12 15:49:35 字數 1751 閱讀 8242

將長度為n的字串a通過設定的演算法,轉換為長度為m且小於n的字串b,字串b通過相應的演算法,可以再次轉換為字串a,該演算法稱為字串壓縮演算法。

問題

小q想要給他的朋友傳送乙個神秘字串,但他發現字串的長度過長,於是小q發明了一種壓縮演算法對字串重複的部分進行了壓縮。

對於字串內連續的m個相同的子串s將會壓縮為m|s。例如字串abcabcabc會被壓縮為[3|abc],現在小q的同學收到了小q傳送過來的字串,你能幫助還原字串嗎?

壓縮演算法描述:

被壓縮的子串長度不超過1000,子串僅包含大寫字母和[、]、|字元。演算法掃瞄整個字串,遇到連續相同的子串,對子串進行壓縮,輸出壓縮後的格式字串,若不是連續的子串,該子串原樣輸出。

壓縮格式為:[count|子串]

其中,count為子串重複的次數,子串為連續重複的字串。

示例1

輸入壓縮字串

hg[3|b[2|ca]]f

輸出解壓後字串

hgbcacabcacabcacaf

解讀本題難點在於括號內巢狀括號,需要從內向外生成與拼接字串,可以使用遞迴結構對字串進行解壓縮。

程式設計思路:

定義x,y,z三個變數,預設值為-1,程式掃瞄字串s時,分別記錄字元'[、'|'、']'在字串s的索引位置,在掃瞄過程中,若遇到字元']',則停止掃瞄,提取處於字元'|'和字元']'範圍內的重複子串,對提取的重複子串解壓處理,並生成需要繼續遞迴處理的字串。若掃瞄結束x,y,z都為預設值,則直接返回s。

# 定**碼函式

def decode(s):

i = 0

x, y, z = -1, -1, -1

# 遍歷字串s

while i < len(s):

# 記錄'['的索引位置

if s[i] == '[':

x = i

# 記錄'|'的索引位置

elif s[i] == '|':

y = i

# 記錄']'的索引位置

elif s[i] == ']':

z = i

# 掃瞄到']'字元時,跳出迴圈

break

i += 1

# 處理重複的字串

if x != -1 and y != -1 and z != -1:

# 從字串s獲取重複次數

times = int(s[x + 1:y])

# 從字串s獲取重複子串

sub = s[y + 1:z]

# 計算需要再次遞迴處理的字串

decode_str = s[:x] + times * sub + s[z + 1:]

# 遞迴處理字串

return decode(decode_str)

# 若沒有重複的字串,返回s

return s

if __name__=='__main__':

print(decode("hg[3|b[2|ca]]f"), end='')

安卓手機應用商店

abc三個字串 字串壓縮演算法(騰訊筆試題)

將長度為n的字串a通過設定的演算法,轉換為長度為m且小於n的字串b,字串b通過相應的演算法,可以再次轉換為字串a,該演算法稱為字串壓縮演算法。問題小q想要給他的朋友傳送乙個神秘字串,但他發現字串的長度過長,於是小q發明了一種壓縮演算法對字串重複的部分進行了壓縮。對於字串內連續的m個相同的子串s將會壓...

試題 演算法提高 字串壓縮

問題描述 編寫乙個程式,輸入乙個字串,然後採用如下的規則對該字串當中的每乙個字元進行壓縮 1 如果該字元是空格,則保留該字元 2 如果該字元是第一次出現或第三次出現或第六次出現,則保留該字元 3 否則,刪除該字元。例如,若使用者輸入 occurrence 經過壓縮後,字元c的第二次出現被刪除,第一和...

試題 演算法提高 字串壓縮

思路 利用乙個與輸入字串相同長度且值為0的陣列來記錄各個字元出現的次數,最後將符合條件的列印出來即可。詳見 在藍橋杯系統執行滿分。資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 編寫乙個程式,輸入乙個字串,然後採用如下的規則對該字串當中的每乙個字元進行壓縮 1 如果該字元是空格,...