【C++算法】68.栈_字符串解码
文章目录
- 题目链接:
- 题目描述:
- 解法
- C++ 算法代码:
题目链接:
394. 字符串解码
题目描述:
解法
用栈来模拟。
两个栈,一个放字符串一个放数字。
然后就遇到第一个右括号了,把两个栈的栈顶拿出来,
接着把bcbc放到原来栈顶元素的后面
然后把abcbc
拿出来,就变成空串了,所以有个细节就是字符串的栈里面要先放入一个空串。
接下来遇到de
,就直接放到栈顶元素的后面,因为没有右括号就不需要重复。
继续执行,最后弹出string
的栈顶元素。
C++ 算法代码:
class Solution
{
public:string decodeString(string s) {// 字符串解码算法// 基本思路:使用两个栈分别存储重复次数和字符串片段stack<int> nums; // 存储重复次数的栈stack<string> st; // 存储字符串片段的栈st.push(""); // 初始化字符串栈,放入空字符串作为起始int i = 0, n = s.size(); // i是当前处理位置,n是字符串长度while(i < n){if(s[i] >= '0' && s[i] <= '9') // 处理数字(重复次数){// 提取完整的数字int tmp = 0;while(i < n && s[i] >= '0' && s[i] <= '9'){tmp = tmp * 10 + (s[i] - '0');i++;}nums.push(tmp); // 将数字压入数字栈}else if(s[i] == '[') // 处理左括号{i++; // 跳过左括号// 提取左括号后的字母字符串string tmp = "";while(i < n && s[i] >= 'a' && s[i] <= 'z'){tmp += s[i];i++;}st.push(tmp); // 将提取的字符串压入字符串栈}else if(s[i] == ']') // 处理右括号,表示一个编码片段结束{// 弹出当前字符串片段和对应的重复次数string tmp = st.top();st.pop();int k = nums.top();nums.pop();// 将字符串重复k次,并添加到栈顶字符串末尾while(k--){st.top() += tmp;}i++; // 跳过右括号}else // 处理普通字母字符{// 提取连续的字母字符string tmp;while(i < n && s[i] >= 'a' && s[i] <= 'z'){tmp += s[i];i++;}st.top() += tmp; // 将提取的字符串添加到栈顶字符串末尾}}return st.top(); // 返回最终解码后的字符串}
};