题目描述:
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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 };