0394. 字符串解码 Decode String
这个问题也需要用栈, 因为有先入后入的操作. 但不同之处在于要使用两个栈, 分别存储数字和字符串.
另外, 在遍历字符串时, 要分别拼装数字和字符串.
以 3[a]2[bc]
为例:
代码实现
Rust
C++
#include <cassert>
#include <stack>
#include <string>
std::string decode_string(std::string s) {
// 数字栈, 用于存放遇到的数字.
std::stack<int> num_stack;
// 字符串栈, 用于存放中间的字符串.
std::stack<std::string> str_stack;
// 存放当前的数字
int num = 0;
// 存放当前的字符串
std::string letters;
for (char chr : s) {
if (std::isdigit(chr)) {
// 数字
const int digit = static_cast<int>(chr - '0');
num = num * 10 + digit;
} else if (chr == '[') {
// 将当前的数字和字符串入栈
num_stack.push(num);
num = 0;
str_stack.push(letters);
letters.clear();
} else if (chr == ']') {
// 遇到了右括号, 进行字符串的拼装.
int last_num = num_stack.top();
num_stack.pop();
// new_letters = last_str + last_num * letters
std::string last_str = str_stack.top();
str_stack.pop();
std::string new_letters = last_str;
for (int i = 0; i < last_num; ++i) {
new_letters += letters;
}
letters = new_letters;
} else {
// 其它字符
letters += chr;
}
}
return letters;
}