难度中等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;
}
};