这里是题目描述:LeetCode-394.字符串解码
本题的难点在于:一个数字[字符串]
组合的括号内,还可能嵌套着一个或多个数字[字符串]
组合,如何正确的解码这种嵌套结构是本题的难点。
我们使用 “栈” 这种数据结构来解决此类嵌套括号结构问题。注意这里说的是“此类问题”,因为许多拥嵌套括号结构的问题都可以使用栈来解决。后续会对这一类问题进行补充整理
我们从左向右遍历题目给出的字符串(待解码内容),并维护一个栈,用来先进先出地存储遍历到的待解码的内容。如果遍历到数字、左括号[
、字母则将它们存入栈中;如果遍历到右括号]
,则证明一个数字[字符串]
遍历完毕,接下来对该数字[字符串]
进行解码:
在栈顶元素是字母时不断出栈并连接成待解码字符串,直到栈顶元素是左括号[
,将栈顶左括号弹出并舍弃后,新的栈顶元素一定是数字,因为编码的格式是数字[字符串]
,数字一定在左括号进栈前一步进栈;将刚才保存的待解码字符串复制为栈顶数字倍,则当前数字[字符串]
组合便解码完成;将栈顶数字弹出,并将解码得到的字符串重新入栈
继续按照上面的方法遍历题目给出的待解码字符串,直到遍历完毕。此时栈中的元素一定都是字符串,将栈中所有的元素出栈,连接成的字符串就是解码结果
题解代码:
class Solution {
public String decodeString(String s) {
if(s.length()==0)
{
return "";
}
Stack<String> stack=new Stack<>();
for(int i=0;i<s.length();i++)
{
char ch=s.charAt(i);
if(ch>='0' && ch<='9') //遇到数字
{
StringBuffer sb=new StringBuffer();
for(;i<s.length();i++) //向后寻找,确定数字
{
char ch1=s.charAt(i);
if(ch1>='0' && ch1<='9')
{
sb.append(ch1);
}
else
{
break;
}
}
stack.push(sb.toString()); //数字入栈
i--;
}
else if(ch=='[') //左括号直接入栈
{
stack.push(ch+"");
}
else if(ch==']') //右括号,解码当前 数字[字符串] 结构后,解码结果重新入栈
{
String temp="";
while(!stack.peek().equals("["))
{
temp=stack.pop()+temp;
}
stack.pop();
int number=Integer.parseInt(stack.pop());
String temp2="";
for(int j=0;j<number;j++)
{
temp2=temp2+temp;
}
stack.push(temp2);
}
else //字母直接入栈
{
stack.push(ch+"");
}
}
String res="";
while(!stack.isEmpty())
{
res=stack.pop()+res;
}
return res;
}
}