leetcode 394. 字符串解码

题目描述:

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: 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".

 

思路分析:

用到深搜的思想,借助栈通过递归实现。定义两个栈,一个int类型,保持每种字符串的出现次数;一个string类型,保持每种类型的字符串。遍历一遍字符串,对于不同字符做不同处理:

数字:将字符数字转化为数字

‘[': 表示开始一种新的字符串类型,将其对应的出现次数存入栈中。当前的字符串存入字符串栈中。

‘]':表示当前字符串结束,统计出现次数,更新当前字符串栈栈顶元素,同时更新当前字符串表示。

其他字符:更新当前字符串。

 

代码:

 1 class Solution {
 2 public:
 3     
 4     string decodeString(string s) {
 5         if(s.size()==0)
 6             return s;
 7         stack<int>nums;
 8         stack<string>strs;
 9         string res="";
10         int len = s.size();
11         int num=0;
12         for(int i=0; i<len; i++)
13         {
14             if(s[i]>='0' && s[i]<='9')
15             {
16                 num = num*10 + s[i]-'0';
17             }
18             else if(s[i]=='[')
19             {
20                 nums.push(num);
21                 num=0;
22                 strs.push(res);
23                 res = "";
24             }
25             else if(s[i]==']')
26             {
27                 int times = nums.top();
28                 nums.pop();
29                 for(int t=0; t<times; t++)
30                     strs.top() += res;
31                 res = strs.top();
32                 strs.pop();
33             }
34             else
35             {
36                 res += s[i];
37             }
38         }
39         return res;
40     }
41 };

 

posted @ 2019-08-28 13:43  Fzu_LJ  阅读(211)  评论(0编辑  收藏  举报