將長度為n的字串a通過設定的演算法,轉換為長度為m且小於n的字串b,字串b通過相應的演算法,可以再次轉換為字串a,該演算法稱為字串壓縮演算法。問題小q想要給他的朋友傳送乙個神秘字串,但他發現字串的長度過長,於是小q發明了一種壓縮演算法對字串重複的部分進行了壓縮。
對於字串內連續的m個相同的子串s將會壓縮為m|s。例如字串abcabcabc會被壓縮為[3|abc],現在小q的同學收到了小q傳送過來的字串,你能幫助還原字串嗎?
壓縮演算法描述:
被壓縮的子串長度不超過1000,子串僅包含大寫字母和[、]、|字元。演算法掃瞄整個字串,遇到連續相同的子串,對子串進行壓縮,輸出壓縮後的格式字串,若不是連續的子串,該子串原樣輸出。
壓縮格式為:[count|子串]
其中,count為子串重複的次數,子串為連續重複的字串。
示例:
輸入壓縮字串
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
常用的三個字串型別剖析
常用的三個字串型別有string,stringbuffer,stringbuilder 它們的底層資料結構都是字元陣列。string 底層陣列是乙個被final描述的字元陣列。所以不可變 繼承了abstractstringbuilder,abstractstringbuilder裡定義了乙個字元陣列...
(c語言)比較三個字串的大小
問題描述 比較三個字串的大小,並且按從小到大的順序輸出。程式分析 1.在寫這個程式的時候,主要是寫了乙個swap函式,呼叫了標準庫函式中的strcmp來實現的。2.在寫swap這個函式的時候將函式引數設定為兩個二級指標而不設定為一級指標。我這樣理解 要輸出三個字串陣列並且這三個還得按大小輸出。輸出字...
左旋字串k個字元
常用方法左旋字串 include include include pragma warning disable 4996 void left move char str,int len,int steps str i 1 tmp int main 為了使程式簡便,將字串進行拷貝並與字串相連線,組成乙...