遞迴 堆疊 394 字串解碼

2021-10-06 14:10:27 字數 2132 閱讀 8595

給定乙個經過編碼的字串,返回它解碼後的字串。

編碼規則為: k[encoded_string],表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證為正整數。

你可以認為輸入字串總是有效的;輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。

此外,你可以認為原始資料不包含數字,所有的數字只表示重複的次數 k ,例如不會出現像 3a 或 2[4] 的輸入。

示例:

s =

"3[a]2[bc]"

, 返回 "aaabcbc"

.s =

"3[a2[c]]"

, 返回 "accaccacc"

.s =

"2[abc]3[cd]ef"

, 返回 "abcabccdcdcdef"

.

解題:遞迴

遞迴處理,關注當前正在遍歷的字元;

(1)若當前字元為數字,計算出數字總數,後必跟【,跳過,得到【】內的字串getstring(),後跳過】,按n的次數得到總的字串;

(2)若當前字元為字元,res=該字元,繼續遍歷下乙個字元,res+=下乙個字元;

(3)若當前為』]』,則該括號內字串遍歷完成,返回「」即可;

class

solution

private

: string src;

size_t ptr;

intgetnum()

string getstring()

elseif(

isalpha

(src[ptr]))

return res+

getstring()

;}};

注意點

遞迴函式的作用——得到字串;

遇到數字,則計算數字,跳過方括號,得到內部的字串,乘以倍數後返回;

遇到字元,返回該字元+下乙個遞迴;

關鍵點

將遞迴函式的引數轉化為類變數,可減少傳引數的誤差,方便遍歷;

解法二: 堆疊迭代

用陣列模擬堆疊,方便最後accumulate組合;

(1)遇到數字,get數字,放入堆疊

(2)遇到[和字元,都放入堆疊;

(3)遇到』]』,開始操作,乙個個出棧直到看到』[』,tmp為中間的字串,取出』['前面的數字,複製數字個tmp,放回堆疊;

注意點

tmp新增時要從後往前新增,符合堆疊先進後出;

(4)遍歷完將堆疊組合,即為答案;

class

solution

else

if(s[ptr]

==']')

stk.

pop_back()

;//去掉[

//reverse(tmp.begin(),tmp.end());

//得到數字

n=stoi

(stk.

back()

);stk.

pop_back()

;//去掉數字

while

(n--

) res+

=tmp;

stk.

push_back

(res)

; ptr++;}

else stk.

push_back

(string(1

,s[ptr++])

);//char轉為string

}return std::

accumulate

(stk.

begin()

,stk.

end(),

string()

);}private

: vector stk;

int ptr;

intgetnum

(string s)

intstoi

(string s)

return n;}}

;

394 字串解碼

給定乙個經過編碼的字串,返回它解碼後的字串。編碼規則為 k encoded string 表示其中方括號內部的 encoded string 正好重複 k 次。注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始資料不...

394 字串解碼

思路 思路一 使用棧 這種括號或者括號套括號的模式非常適合用棧來解決,設定乙個輔助棧,當遇到 的時候,開始將所有東西推到 棧中,直到遇到 時,開始取棧中的東西。取得方法 先取字元,再取數字,計算得到到的東西再壓入棧中 直到所有 都遍歷完為止 注意點 從棧中取的順序和最終生成結果得順序應該一致 cla...

394 字串解碼

注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始資料不包含數字,所有的數字只表示重複的次數 k 例如不會出現像 3a 或 2 4 的輸入。輔助棧解法 遍歷字串 s 中每個字元 c 當 c 為數字時,將數字字元轉化為...