394:字符串解码
链接: Leetcode394.字符串解码
类似题目:
代码随想录二刷-有效的括号
代码随想录二刷-删除字符串中的所有相邻重复项
题目需求
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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”
思路
-
分析题干
a. 题目给出一个特殊格式的字符串并告知了含义,也就是说看到"[ ]"时候,需要将括号里的字符重复k次,最终得到一个字符串【第一步】
b. 类似于有效括号或删除重复项的题目,就是用栈去存元素,当遇到符合格式的元素时,就要进行特殊操作,操作完后还要压入栈中,这样才能保证最后输出结果的连贯性【第二步】
c. 这里会遇到一个问题:当我们处理好重复字符后,它变成一个字符串了,那我还按照字符压栈会不会很耗时间?【第三步】
d. 会的,因为这相当于重复操作,但是leetcode上可以通过【第四步】 -
写题顺序
a. 创建一个栈,存储元素类型为char
b. 遍历字符串,一个个字符进栈。当遇到“]”时,开始进行如下操作:
i. 把字符都取出来,直到遇到“[”,把"[" pop掉
ii. 把数字也取出来
iii. 然后根据数字重复增加字符,构造好后压入栈中 -
注意事项
a. 注意取数字的时候,一定要完整取完,次数有的超过10,那数字会占两个字符 -
代码
class Solution {
public:
string decodeString(string s) {
if (s.size() == 1) return s;
stack<char> sta;
sta.push(s[0]);
for (int i = 1; i < s.size(); ++i) {
if (s[i] == ']') {
string temp = "";
// 找到括号里的所有字符
while (!sta.empty() && sta.top() != '[') {
temp += sta.top();
sta.pop();
}
sta.pop();
string num = "";
// 找到要重复的完整次数【易错】
while(!sta.empty() && sta.top() >= '0' && sta.top() <= '9'){
num = sta.top() + num;
sta.pop();
}
int count = stoi(num);
string str = temp;
count--;
while (count--) {
str += temp;
}
for (int i = str.size() - 1; i >= 0; --i) {
sta.push(str[i]);
}
} else {
sta.push(s[i]);
}
}
string result = "";
while (!sta.empty()) {
result += sta.top();
sta.pop();
}
reverse(result.begin(), result.end());
return result;
}
};