题解
看到括号很容易想到栈。用stack的思路就是每遇到一个 ],不停出栈直到
遇到对应的 [ 再出栈把数字倒出来。大体思路就是这样。
当然我们不需要显式的用stack,用递归也是一样的,我的解法就是递归。
这里给几点tips:
- 递归解法是想把原问题分解为小问题,这题的所谓小问题就是
decode 一个[]内的字符串。 - 注意只要有数字就会有[],每个[]内可能有数字也可能没有,但必然
会有字母。 - 如何设计 dfs 函数有点讲究,我们dfs只解决一个[]内的字符串。
Code
class Solution {
public:
string ts;
int n;
string decodeString(string s) {
n = s.size();
ts = s;
int k=0;
return dfs(k);
}
string dfs(int &p){// 注意这个引用的p,有两个作用。一是提示开始,二是作返回值
int pos = p,ed;// 我们让他返回最后的位置,便于跳过递归过的位置
string str("");
char c;
int num=0;
while(ts[pos]!=']' && pos <n){
c = ts[pos];
if(isdigit(c)){
num*=10;
num+= c-'0';
}else if(isalpha(c)){
str+=c;
}else if( c=='['){// key point
ed = pos+1;
string tmp = dfs(ed);
for(int i=0;i<num;i++) str+=tmp;
pos = ed+1;
num=0;
continue;
}
pos++;
}
p = pos;
return str;
}
};