給定乙個經過編碼的字串,返回它解碼後的字串。
編碼規則為: 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 為數字時,將數字字元轉化為...