给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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”
提示:
- s 由小写英文字母、数字和方括号 ‘[]’ 组成
- s 保证是一个 有效 的输入。
- s 中所有整数的取值范围为 [1, 300]
思路:
- 扫描原始字符串,通过栈来展开,得到相应的结果串
- 当前字符为数字时,则将数字提取出来,入栈
- 当前字符为字母或者 ‘[’ 时,则直接入栈
- 当前字符为 ‘]’ 时
- 则开始弹出栈顶元素,并拼接子字符串,直到栈顶为 ‘[’
- 将栈顶的数字弹出,代表子串的重复次数,通过调用函数,进行拼接
- 将拼接后的重复子串入栈
- 重复上面的过程,直到扫描结束
- 此时,栈中只有重复子串,依次弹出,并拼接好,返回最终结果
class Solution {
public:
string stk[35];
int tt = -1;
string decodeString(string s) {
string u = "";
int n = s.size();
for(int i = 0; i < n; i++){
if(isNumber(s[i])){
int j = i + 1;
while(j < n && isNumber(s[j])) j++;
u = s.substr(i, j - i);
i = j - 1;
stk[++tt] = u;
} else if(isLetter(s[i]) || s[i] == '['){
stk[++tt] = s[i];
} else if(s[i] == ']'){
string x = "";
while(stk[tt] != "[") x = stk[tt--] + x;
tt--;
int cnt = stoi(stk[tt--]);
stk[++tt] = countString(x, cnt);
}
}
string res = "";
while(tt != -1) res = stk[tt--] + res;
return res;
}
bool isLetter(char c){
return 'a' <= c && c <= 'z';
}
bool isNumber(char c){
return '0' <= c && c <= '9';
}
string countString(string& s, int t){
string ss = "";
for(int i = 0; i < t; i++){
ss += s;
}
return ss;
}
};