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 );
    }
相关推荐
影sir5 分钟前
不同测试数据下,该如何选择算法
算法·深度优先
潇湘散客18 分钟前
CAX软件插件化设计实现牛刀小试
c++·算法·图形学·opengl
速易达网络26 分钟前
2026,视觉算法正在经历一场静默革命
算法
WBluuue1 小时前
Codeforces 1094 Div1+2(ABCDE)
c++·算法
TENSORTEC腾视科技1 小时前
腾视科技大模型一体机解决方案:低成本私有化落地,重塑行业智能应用新格局
大数据·人工智能·科技·算法·ai·零售·大模型一体机
夏日听雨眠1 小时前
数据结构(循环队列)
数据结构·算法·链表
平行侠1 小时前
30MacLaren-Marsaglia算法故事文件
数据结构·算法
灵动小溪1 小时前
claude code工具PC安装部署
人工智能·算法
Asa121382 小时前
Nature Microbiology|跨微生物界菌株水平传播推断的新算法TRACS
算法
叼烟扛炮3 小时前
C++ 知识点22 函数模板
开发语言·c++·算法·函数模版