LeetCode - 394. 字符串解码

发布于:2025-06-11 ⋅ 阅读:(22) ⋅ 点赞:(0)

题目

394. 字符串解码 - 力扣(LeetCode)

思路

使用两个栈:一个存储重复次数,一个存储字符串

遍历输入字符串:

  • 数字处理:遇到数字时,累积计算重复次数
  • 左括号处理:保存当前状态(入栈),开始处理新的嵌套部分
  • 字母处理:直接添加到当前字符串,不涉及栈操作
  • 右括号处理:完成当前嵌套部分,应用重复规则,恢复之前的状态(出栈)

最终返回处理后的字符串

该算法能够处理嵌套的编码,例如"2[a2[bc]]"这样的情况。时间复杂度为O(n),其中n是输入字符串的长度。

过程

  • countStack: []
  • strStack: []
  • currentStr: ""
  • count: 0

处理字符 '3'

字符: '3'
操作: 数字 → 更新count = 3
countStack: []
strStack: []
currentStr: ""
count: 3

处理字符 '['

字符: '['
操作: 左括号 → 保存当前状态,重置当前变量
countStack: [3]  ← 入栈
strStack: [""]   ← 入栈
currentStr: ""   ← 重置
count: 0         ← 重置

 处理字符 'a'

字符: 'a'
操作: 字母 → 添加到currentStr
countStack: [3]
strStack: [""]
currentStr: "a"  ← 添加'a'
count: 0

处理字符 ']'

字符: ']'
操作: 右括号 → 出栈并应用重复
countStack: []   ← 弹出3
strStack: []     ← 弹出""
重复计算: "" + "a"*3 = "aaa"
currentStr: "aaa"  ← 更新
count: 0

 处理字符 '2'

字符: '2'
操作: 数字 → 更新count = 2
countStack: []
strStack: []
currentStr: "aaa"
count: 2         ← 更新

  处理字符 '['

字符: '['
操作: 左括号 → 保存当前状态,重置当前变量
countStack: [2]      ← 入栈
strStack: ["aaa"]    ← 入栈
currentStr: ""       ← 重置
count: 0             ← 重置

 处理字符 'b'

字符: 'b'
操作: 字母 → 添加到currentStr
countStack: [2]
strStack: ["aaa"]
currentStr: "b"      ← 添加'b'
count: 0

 处理字符 'c'

字符: 'c'
操作: 字母 → 添加到currentStr
countStack: [2]
strStack: ["aaa"]
currentStr: "bc"     ← 添加'c'
count: 0

 处理字符 ']'

字符: ']'
操作: 右括号 → 出栈并应用重复
countStack: []       ← 弹出2
strStack: []         ← 弹出"aaa"
重复计算: "aaa" + "bc"*2 = "aaa" + "bcbc" = "aaabcbc"
currentStr: "aaabcbc"  ← 更新
count: 0

  处理结束

最终结果: "aaabcbc"

一些难点解读

正确写法

class Solution {
public:
    string decodeString(string s) {
        stack<int> countStack;
        stack<string> strStack; 
        string currentStr = "";
        int count = 0;
        for(int i = 0; i<s.size();i++)
        {
            if(isdigit(s[i]))
            {
                count = count * 10 + (s[i] - '0');
            }
            else if(s[i] == '[')
            {
                countStack.push(count);
                strStack.push(currentStr);
                count = 0;
                currentStr = "";
            }
            else if(s[i] == ']')
            {
                int repeatTimes = countStack.top();
                countStack.pop();

                string decodedStr = strStack.top();
                strStack.pop();

                for(int i = 0; i< repeatTimes; i++)
                {
                    decodedStr += currentStr;
                }

                currentStr = decodedStr;
            }
            else
            {
                currentStr += s[i];
            }
        }
    return currentStr;
    }
};