394. 字符串解码
难度中等1067收藏分享切换为英文接收动态反馈
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例 1:
输入:s = "3[a]2[bc]"
输出:"aaabcbc"
示例 2:
输入:s = "3[a2[c]]"
输出:"accaccacc"
示例 3:
输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"
示例 4:
输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"
提示:
1 <= s.length <= 30
s 由小写英文字母、数字和方括号 '[]' 组成
s 保证是一个 有效 的输入。
s 中所有整数的取值范围为 [1, 300]
题解:
一个思想就是在设置两个变量,在遇到【之前 res是空的 minit用来存储遇见【之前的数字,res是存储【】内部的字母,遇到】之后,则弹出stack 之前存储的,进行求解。
Python代码:
class Solution: def decodeString(self, s: str) -> str: stack , res , minit = [] , '' , 0 #构建原变量 for i in s: if i == '[': #如果遇到左括号则将值的res 和 minit压入栈备用 stack.append([res , minit]) res , minit = '' , 0 #压入栈之后清零 如果再遇到第二个【 则进行第二个 elif i == ']': last_res , last_minit = stack.pop() #遇到】 则弹出之前压入栈的 数字和 【】内的值 进行拼接 res = last_res + res*last_minit elif '0'<=i<='9': #存在大于10的值,则需要进行minit*10 + int(i)操作 minit = minit*10 + int(i) else: res += i #用来拼接某个【】中的内容 return res
C++代码:
class Solution { public: string decodeString(string s) { string res = ""; stack<int> minit ; stack<string> strs ; int num = 0; int n = s.size(); for (int i=0; i<n; i++){ if (s[i] == '['){ minit.push(num); strs.push(res); num = 0; res = ""; } else if (s[i] == ']'){ int tes = minit.top(); minit.pop(); for (int j=0; j<tes; j++) strs.top() += res; res = strs.top(); strs.pop(); } else if (s[i] >= '0' && s[i] <= '9'){ num = num*10 + s[i] - '0'; } else{ res = res + s[i]; } } return res; } };