目錄
題目詳情
給定一個經過編碼的字符串,返回它解碼後的字符串。
編碼規則爲: 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".
——題目難度:中等
這次的題目讓我知道了這類有關括號的匹配的題目,就應當先考慮用棧來解決問題。
因爲棧“先進後出”的性質 很適合 這種匹配的題目。
有關棧的介紹和方法總結
棧(stack)又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表,這一端被稱爲棧頂,相對地,把另一端稱爲棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成爲新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成爲新的棧頂元素。
頭文件
C++ 使用STL棧stack時 所需要包含的頭文件爲 <stack>
棧的常用函數有:
push(elem) 將元素elem入棧
pop() 移除棧頂元素(刪除)
top() 返回棧頂元素(不刪除)
empty() 判度棧是否爲空
size() 求棧內元素的個數
- 下面代碼
class Solution {
public:
string decodeString(string s) {
int len = s.size(), num = 0;
string ans = "";
/*nums中每個元素存儲對應的'['前的數字*/
stack<int> nums;
/*strs中每個元素先用來存儲對應的'['前的字符串,後面當遇到']'時暫時用作其他功能 */
stack<string> strs;
for(auto ch: s)
{
if(ch >= '0' && ch<='9') {
num = num*10 + ch-'0';
}
else if(ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {
ans += ch;
}
else if(ch == '[') { //將'['前的數字和字符串 分別 壓入對應的棧中
nums.push(num);
num = 0;
strs.push(ans);
ans = "";
}
else if(ch == ']') { //將num和strs的棧頂元素出棧
int times = nums.top();
nums.pop(); //移除棧頂元素
for(int i=0; i<times; i++)
{
strs.top() += ans;
}
ans = strs.top();
strs.pop(); //移除棧頂元素
}
}
return ans;
}
};
結果