题解:
1.问题描述:给定一个编码字符串,返回它的解码字符串。编码规则是:k [encoded_string],其中方括号内的encoded_string被重复k次。 注意,k被保证为正整数。
2.解题思路:
s = "3[a2[c]]", return "accaccacc".
通过这个例子,可以看出需要从内向外逐步展开括号来得到最终的解码字符串。
参考了数据结构书上的括号匹配的算法之后,可以类似得到这道题的算法:
创建一个栈stk用来存放字符
for 字符串 s 中的每一个字符 ch
if ch 不是右方括号 ]
将ch压入栈中
else
声明一个空串temp用来记录 [ ] 之间的内容
while 栈顶元素不是左方括号 [
temp = 栈顶元素 + temp
弹出栈顶元素
弹出左方括号 [
声明一个num用来记录k
while 栈不空且栈顶元素为数字
在num上不断叠加
弹出栈顶元素
向stk中push num次的temp
声明一个空字符串ss并赋予stk中的内容
返回ss
源代码如下:
#include <iostream>
#include <stack>#include <string>
using namespace std;
class Solution {
public:
string decodeString(string s) {
stack<char> result;
for(int i=0;i<s.size();i++)
{
if(s[i]!=']')
result.push(s[i]);
else
{
string temp="";
while(result.top()!='[')
{
temp=result.top()+temp;
result.pop();
}
result.pop();
int num=0;
int c=1;
while(!result.empty()&&result.top()>='0'&&result.top()<='9')
{
num+=(result.top()-48)*c;
c*=10;
result.pop();
}
for(int x=0;x<num;x++)
{
for(int y=0;y<temp.size();y++)
result.push(temp[y]);
}
}
}
string decoded="";
while(!result.empty())
{
decoded=result.top()+decoded;
result.pop();
}
return decoded;
}
};