「將長度為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 如果該字元是空格,...