Leetcode C++《热题 Hot 100-63》394. 字符串解码
1. 题目
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例:
s = “3[a]2[bc]”, 返回 “aaabcbc”.
s = “3[a2[c]]”, 返回 “accaccacc”.
s = “2[abc]3[cd]ef”, 返回 “abcabccdcdcdef”.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 思路
- 使用栈,方案:遇到], 就去temp找[, 并把这中间的string拼接起来,然后找到k值,把这个string复制k倍,push进去;如果是左括号,直接push进去;如果是字符串,则将字符串进行拼接
- 时间复杂度 n*n
3. 代码
class Solution {
public:
vector<int> numsV;
string decodeString(string s) {
if (s.length() == 0)
return "";
stack<string> temp;
stack<int> nums;
vector<string> seperateStr = seperateString(s);
int index = 0;
for (int i = 0; i < seperateStr.size(); i++) {
//3[a2[c]]
//3 [ a 2 [ c
// 3 [ a cc
//accaccacc
if (seperateStr[i] == "[") {
temp.push(seperateStr[i]);
//cout << "push: " << seperateStr[i] << endl;
nums.push(numsV[index]);
index++;
}
else if (seperateStr[i] == "]"){
stack<string> subReverseTempStack;
while(!temp.empty() && temp.top() != "[") {
subReverseTempStack.push(temp.top());
//cout << "pop: " << temp.top() << endl;
temp.pop();
}
//cout << "pop: " << temp.top() << endl;
temp.pop();
int k = nums.top();
nums.pop();
string subTemp1="";
string subReverseTemp="";
while(!subReverseTempStack.empty()) {
subReverseTemp += subReverseTempStack.top();
subReverseTempStack.pop();
}
for (int j = 0; j < k; j++)
subTemp1+=subReverseTemp;
//cout << "push: " << subTemp1 << endl;
temp.push(subTemp1);
} else {
// ab cd ef
//ef cd ab
stack<string> subReverseTempStack;
subReverseTempStack.push(seperateStr[i]);
while(!temp.empty() && temp.top() != "[") {
subReverseTempStack.push(temp.top());
//cout << "pop: " << temp.top() << endl;
temp.pop();
}
string subTemp="";
while(!subReverseTempStack.empty()) {
subTemp += subReverseTempStack.top();
subReverseTempStack.pop();
}
temp.push(subTemp);
//cout << "push: " << subTemp << endl;
}
}
string res= "";
stack<string> res_stack;
while (!temp.empty()) {
res_stack.push(temp.top());
temp.pop();
}
while (!res_stack.empty()) {
res += res_stack.top();
res_stack.pop();
}
return res;
}
vector<string> seperateString(string s) {
vector<string> seperateStr;
int i = 0;
for (i = 0; i < s.length(); i++) {
if (s[i] == '[' || s[i] == ']')
seperateStr.push_back(s.substr(i,1));
else if (s[i] >= '0' && s[i] <= '9') {
int startNumIndex = i;
while (s[i] >= '0' && s[i] <= '9') {
i++;
}
numsV.push_back(stoi(s.substr(startNumIndex,i-startNumIndex),0,10));
i--;
} else {
int startStrIndex = i;
while (i < s.length()) {
if (s[i] >= '0' && s[i] <= '9')
break;
if (s[i] == '[' || s[i] == ']')
break;
i++;
}
seperateStr.push_back(s.substr(startStrIndex,i-startStrIndex));
i--;
}
}
/*for (int i = 0; i <seperateStr.size(); i++)
cout << seperateStr[i] << " ";
cout << endl;*/
return seperateStr;
}
};