LeetCodehot100-394 字符串解码

复制代码
class Solution {
public:
    string decodeString(string s) {
        // pair 里存的是:<左括号前的倍数, 左括号前的字符串>
        stack<pair<int, string>> st;
        int time = 0;          // 记录当前的倍数(注意初始化为 0)
        string result = "";    // 记录当前的字符串

        for (int i = 0; i < s.size(); i++) {
            char c = s[i];

            if (isdigit(c)) {
                // 处理多位数字"
                time = time * 10 + (c - '0');
            } 
            else if (isalpha(c)) {
                // 如果是字母,直接加到当前 result 里
                result += c;
            } 
            else if (c == '[') {
                // 遇到 '[',开始存档,并清空当前状态给括号内使用
                st.emplace(time, result);
                time = 0;
                result = ""; 
            } 
            else if (c == ']') {
                // 遇到 ']',提取存档
                auto [last_time, last_string] = st.top();
                st.pop();

                // 将括号里的内容 (也就是现在的 result) 翻倍
                string temp = "";
                for (int k = 0; k < last_time; k++) {
                    temp += result;
                }

                // 拼接到进括号前的历史字符串后面,成为新的 result
                result = last_string + temp;
            }
        }
        
        return result;
    }
};
复制代码
time = time * 10 + (c - '0');

处理多位数字,例如 "123" 依次得到:1 → 12 → 123

输入:"3[a2[c]]"

步骤 字符 time result 栈
1 '3' 3 "" 空
2 '[' 0 "" (3, "")
3 'a' 0 "a" (3, "")
4 '2' 2 "a" (3, "")
5 '[' 0 "" (3, ""), (2, "a")
6 'c' 0 "c" (3, ""), (2, "a")
7 ']' 0 "a" + "c"×2 = "acc" (3, "")
8 ']' 0 "" + "acc"×3 = "accaccacc" 空

递归:

复制代码
class Solution {
public:
    string dfs(const string& s,int&index){
        string res="";
        while(index<s.size()&&s[index]!=']'){
            if(!isdigit(s[index])){
                res+=s[index++];
            }
            else{
                int num=0;
                while(index<s.size()&&isdigit(s[index++])){
                    num=num*10+s[index]-'0';
                }
                //[
                index++;
                string inner=dfs(s,index);
                index++;
                for (int i = 0; i < num; i++)
			{
				res += inner;
			}
              
            }
        }
        return res;
    }
    string decodeString(string s) {
        int index=0;
        return dfs(s,index );
    }
相关推荐
秋天的怀念_David1 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院2 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng2 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~4 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py5 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing6 小时前
LeetCode100 42.接雨水
java·算法·leetcode
域限奇点访客6 小时前
用AI生成问卷的网站怎么选?看题目录入结构、题型映射和生成后的校验
算法
not coder7 小时前
一文讲通--从树到红黑树
数据结构·算法
octopus_c7 小时前
C++ 入门
开发语言·c++·算法
ZhengEnCi7 小时前
2026年10月30日AI早报:Gemini 4 Carbon登顶、DeepSeek融资1055亿、智元机器人上岗实测
人工智能·算法