力扣394 字串解碼

2021-10-02 11:35:48 字數 1778 閱讀 9872

這道題主要涉及的是對遞迴和棧的理解。

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

編碼規則為: 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".

原題url:

這道題目,簡單來看就是根據數字和內容,進行不斷重複輸出,最終得出結果。因此,遞迴也是最容易讓人想到的。

數字代表內容需要重複的次數,[代表一次新的遞迴開始,]代表本次遞迴的結束,有點類似括號匹配這種問題。只是需要記錄中間結果,以及最開始的s進過一次遞迴遍歷後的下標位置。

基於上面的講解,我們也就能夠寫出**:

class solution 

public int dfs(string s, int index, stringbuilder resultsb)

// 遇到'[',則開始新一輪的遞迴

else if (temp == '[')

// count進行重置

count = 0;

}// 遇到']',結束遞迴

else if (temp == ']')

// 遇到字母

else

index ;

}return index;}}

提交ok。

既然有遞迴的寫法,那麼自然有不遞迴的寫法,這就需要借助棧了。大家可以模擬成計算一段普通的數學表示式,裡面有括號、數字、符號運算等,所以需要兩個棧,分別儲存數字和運算子。

這道題目自然也是需要兩個棧的,乙個用來儲存重複的次數,乙個用來儲存中間的字串結果。判斷出棧、入棧的依據,依據是[代表數字和字串都壓入相應的棧,]代表需要將數字和字串都需要從棧首壓出,進行計算。

接下來看看**:

class solution 

// 遇到'[',將之前的數字和字串放進countstack中

else if (temp == '[')

// 遇到']',從countstack拿出數字

else if (temp == ']')

// 拿出sbstack第乙個

stringbuilder sb = sbstack.pop();

}// 遇到字母

else

}return tempsb.tostring();}}

提交ok。

以上就是這道題目我的解答過程了,不知道大家是否理解了。這道題主要涉及的是對遞迴和棧的理解,有點類似數學表示式的計算,只是做一下模擬即可。

演算法 力扣 394 字串解碼

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

394 字串解碼

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

394 字串解碼

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