題目:
給定一個經過編碼的字符串,返回它解碼後的字符串。
編碼規則爲: 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".
之前做過一個括號匹配的問題,這種類型的題目一般都是要壓棧的,最開始的思路是如果遇到 ‘]’,就在棧中找到第一個匹配的 ‘[’,將二者之間的字符連接起來,再將 '[‘前面的數字連接起來作爲重複次數再次壓棧,遇到’['和其他字符都直接壓棧,最後將棧裏的字符串連接起來就是結果。
考慮到機試的問題,決定以後的代碼都用C++或者C寫了,做題的過程順便複習(預習)C++,所以這次復現的時候有的地方不知道咋寫就看了其他人的代碼,後來看到一個特別好的復現https://leetcode-cn.com/problems/decode-string/solution/zhi-xing-yong-shi-0-ms-zai-suo-you-c-ti-jiao-zh-47/,就照着這個寫了,這個代碼最主要的優化是用vector代替stack和遇到 ']‘後不是把解碼的字符串全部壓進棧,而是暫時放在ans中存儲,也省去了’['的查找時間,i了i了。
看了之後自己仿照寫了個代碼,差不多是默寫了
class Solution {
public:
typedef pair<int,string> pis;
string repeat(string s,int times){
string repeatS="";
for(int i=0;i<times;i++){
repeatS+=s;
}
return repeatS;
}
string decodeString(string s) {
string ans="";
int times=0;
vector<pis> vecStack;
for(auto i:s){
if('0'<=i&&i<='9')
times=times*10+(i-'0');
else if(i=='['){
vecStack.push_back({times,ans});
times=0;
ans="";
}
else if(i==']'){
pis tmp=vecStack[vecStack.size()-1];
vecStack.pop_back();
ans=tmp.second+repeat(ans,tmp.first);
}
else
ans+=i;
}
return ans;
}
};
運行結果: