1. 程式人生 > 實用技巧 >leetcode hot 100-394. 字串解碼

leetcode hot 100-394. 字串解碼

394. 字串解碼

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

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

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

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

示例 1:

輸入:s = "3[a]2[bc]"
輸出:"aaabcbc"
示例 2:

輸入:s = "3[a2[c]]"
輸出:"accaccacc"
示例 3:

輸入:s = "2[abc]3[cd]ef"
輸出:"abcabccdcdcdef"
示例 4:

輸入:s = "abc3[cd]xyz"
輸出:"abccdcdcdxyz"

思路一:利用棧

 1 class Solution {
 2     public String decodeString(String s) {
 3         // 兩個棧,一個儲存Integer元素,一個儲存String元素,兩個棧的棧頂元素是配套使用的
 4         Stack<Integer> multiStack = new Stack<Integer>();
 5          // String元素是當前數字和之前的上一個左括號之間的字串,可以理解為下個重複子串的字首
6 Stack<StringBuilder> prefixStack = new Stack<>(); 7 int multi = 0; // 記錄重複次數 8 StringBuilder prefix = new StringBuilder(); // 記錄下個數字和上個左括號之間的數字,也就是下個重複子串的字首 9 10 for(char c : s.toCharArray()){ 11 12 // 如果遇到數字,更新multi 13 if
(c <= '9' && c >= '0'){ 14 multi = multi * 10 + (c - '0'); // 因為重複次數可能大於10, 所以可能會有多個連續的數字 15 }else if(c == '['){ 16 // 如果遇到左括號,把multi和res入棧, 並且multi和res都置為空,方便內層記錄重複次數和res 17 multiStack.push(multi); 18 prefixStack.push(prefix); 19 multi = 0; 20 prefix = new StringBuilder(); 21 }else if(c == ']'){ 22 // 如果遇到右括號,彈出兩個棧的棧頂元素,重複multi次,把當前prefix中的內容附加到String棧的棧頂元素後面 23 int multiCnt = multiStack.pop(); 24 StringBuilder res = prefixStack.pop(); 25 for(int i = 0; i < multiCnt; i++){ 26 res.append(prefix.toString()); 27 } 28 prefix = res; // 把經過重複後的字串更新為字首 29 }else{ 30 prefix.append(c); // 如果是其他字元,prefix上加上這個字元 31 } 32 } 33 return prefix.toString(); 34 } 35 }
執行用時:0 ms, 在所有Java提交中擊敗了100.00%的使用者 記憶體消耗:36.5 MB, 在所有Java提交中擊敗了95.51%的使用者