Leetcode 字串解碼
阿新 • • 發佈:2021-10-21
字串解碼
給定一個經過編碼的字串,返回它解碼後的字串。
編碼規則為: 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"
這道題可能是我最近花的時間最多的一道題。題目不是特別難。但是總是通不過測試,曾經一度懷疑是題目出現了一個問題。原來是我的答案後面多了一個空格。
這道題的思路和逆波蘭計算器的思路類似,我看到網上很多人的答案用了兩個棧,一個儲存數字,一個儲存字母。但是,我覺得用一個棧就足夠了。思路大致是我們從左到右一直讀取字串,如果不是']'
的話,直接入棧。如果是']'
。我們需要另作分析。
我們遇到']'
,繼續讀取,直到遇到了'['
,我們在這[ , ]
之間構造出一個字串,然後繼續讀取前面的數字。對字串進行疊加。然後在入棧。直到遍歷到最後。最後,棧裡面儲存的就是答案的逆序。我們將其取出構造一個字串,然後將其逆序。這就是大概思路。為了方便,我直接使用了c++封裝的algorithm裡的reverse方法。如果方便,也可以自己寫一個逆序的函式。
class Solution { public: bool isNum(char s){ //判斷是否為數字 if(s>='0'&& s<='9') return true; return false; } string decodeString(string s) { //利用棧來處理,類似於逆波蘭演算法 int index = 0; string ans = ""; stack<char> MyStack; MyStack.push(s[index++]); while(index<=s.size()){ if(MyStack.top()==']'){ MyStack.pop(); string str = ""; string last = ""; while(MyStack.top()!='['){ str += MyStack.top(); MyStack.pop(); } MyStack.pop(); string num; int n = 0; while(MyStack.top()>='0'&&MyStack.top()<='9'){ num += MyStack.top(); MyStack.pop(); if(MyStack.empty()) break; } reverse(num.begin(),num.end()); n = atoi(num.c_str()); for(int i=0;i<n;i++){ last += str; } reverse(last.begin(),last.end()); for(char i:last){ MyStack.push(i); } } else MyStack.push(s[index++]); } while(!MyStack.empty()){ ans += MyStack.top(); MyStack.pop(); } reverse(ans.begin(),ans.end()); ans.pop_back(); return ans; } };
執行用時:0 ms , 在所有 C++ 提交中擊敗了100.00% 的使用者
記憶體消耗:6.3 MB
, 在所有 C++ 提交中擊敗了76.48%的使用者
通過測試用例:
34 / 34