leetcode 394 字符串解码
目录
一、题目描述
二、解题思路
整体思路
具体思路
模拟过程
思路提取
三、代码实现
一、题目描述



二、解题思路
整体思路
本题是一个典型的字符串解码问题,由于存在括号,有后进先出的特性,所以我们可以用双栈模拟来解决这个问题。
具体思路
模拟过程
以s="3[a2[c]]de"为例子来模拟这个过程:
(1)定义两个栈,栈number用于记录数字,栈St用于记录字符串,向St栈中压入空字符串(防止出现s='a......'这种情况),此时两个栈的状态如下:

(2)遍历字符串s:
<1>此时,s[current]为数字字符,就将这个数提取出来,并压入number栈。此时栈的状态如下:

<2>此时,是'[',就向栈中压入一个空字符串。此时栈的状态如下:

<3>此时,为普通字符,就追加到栈顶元素的后面。此时栈的状态如下:

<4>此时,s[current]为数字字符,就将这个数提取出来,并压入number栈。此时栈的状态如下:

<5>此时,是'[c',就向栈中压入一个空字符串,将"c"加入栈顶字符串的后面。此时栈的状态如下:

<6>此时,是']',提取number和St的栈顶元素(弹出)进行解码,将解码的结果加入此时栈的栈顶元素的后面。栈的状态如下:

<7>此时,是']',提取number和St的栈顶元素(弹出)进行解码,将解码的结果加入此时栈的栈顶元素的后面。栈的状态如下:

<7>此时,为普通字符,就追加到栈顶元素的后面。此时栈的状态如下:

s遍历完毕,此时St的栈顶字符串即为解码后的字符串,即为所求。
思路提取
利用双栈进行解码,遍历字符串s:
(1)如果为数字字符,就将数字提取出来,压入number栈;
(2)如果为'[',就向St栈中压入一个空字符串;
(3)如果为']',就弹出St和number的栈顶元素进行解码,将解码后的字符串追加到当前St栈的栈顶字符串的后面;
(4)如果为小写字母,就直接追加到St栈顶字符串的后面;
s遍历完后,St的栈顶字符串即为解码完成的字符串。
三、代码实现
class Solution {
public:string decodeString(string s) {//双栈模拟stack<int> number;stack<string> St;St.push("");//加入空字符串int n=s.size();int current=0;while(current<n){//如果为数字字符(提取)if(s[current]>='0'&&s[current]<='9'){int tmp=0;while(s[current]>='0'&&s[current]<='9'&¤t<n){tmp*=10;tmp+=s[current++]-'0';}number.push(tmp);}//如果为'[',压入空字符串else if(s[current]=='['&¤t<n){St.push("");current++;}//如果为']',解码else if(s[current]==']'&¤t<n){string tmp=St.top();St.pop();int num=number.top();number.pop();string repeated="";for(int i=0;i!=num;i++)repeated+=tmp;St.top()+=repeated;current++;}//处理普通字符else if(s[current]<='z'&&s[current]>='a'&¤t<n){St.top()+=s[current++];}}return St.top();}
};
