394. 字符串解码
394. 字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例 1:
输入:s = "3[a]2[bc]"
输出:"aaabcbc"
输出:"aaabcbc"
示例 2:
输入:s = "3[a2[c]]"
输出:"accaccacc"
输出:"accaccacc"
示例 3:
输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"
输出:"abcabccdcdcdef"
示例 4:
输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"
输出:"abccdcdcdxyz"
思路:
如果当前的字符为数位,解析出一个数字(连续的多个数位)并进栈
如果当前的字符为字母或者左括号,直接进栈
如果当前的字符为右括号,开始出栈,一直到左括号出栈,出栈序列反转后拼接成一个字符串,此时取出栈顶的数字(此时栈顶一定是数字,想想为什么?),就是这个字符串应该出现的次数,我们根据这个次数和字符串构造出新的字符串并进栈
如果当前的字符为字母或者左括号,直接进栈
如果当前的字符为右括号,开始出栈,一直到左括号出栈,出栈序列反转后拼接成一个字符串,此时取出栈顶的数字(此时栈顶一定是数字,想想为什么?),就是这个字符串应该出现的次数,我们根据这个次数和字符串构造出新的字符串并进栈
代码:
class Solution { public: string decodeString(string s) { int len = s.size(); if(!len) return s; int i, j, temp, m; int count = 0, k_size = 0; int k[10]; vector<char> code; stack<char>st; char code_temp; for(i = 0; i < len; i++) { if(s[i] <= '9' && s[i] >= '0') { count++; } else if(s[i]=='[') { temp = 0; for(j = 0; j < count; j++) { temp = s[i-count+j]-'0' + temp *10; } k[k_size++] = temp; count = 0; st.push(s[i]); } else if(s[i] == ']') { code = {}; while(1){ code_temp = st.top(); st.pop(); if(code_temp == '[') break; code.push_back(code_temp); } for(m = 0; m < k[k_size-1]; m++) { for(j = code.size()-1; j >= 0; j--) { st.push(code[j]); } } k_size--; } else { st.push(s[i]); } } code = {}; while(!st.empty()) { code_temp = st.top(); st.pop(); code.push_back(code_temp); } string result; result = code[code.size()-1]; for(i = code.size()-2; i >= 0; i--) { result+=code[i]; } return result; } };
posted on 2020-07-31 23:53 Little-Prince 阅读(170) 评论(0) 编辑 收藏 举报