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 );
    }
相关推荐
Navigator_Z4 小时前
LeetCode //C - 1089. Duplicate Zeros
c语言·算法·leetcode
云泽8087 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法
wlsh157 小时前
Go 迭代器
算法
语戚7 小时前
力扣 3161. 块放置查询:线段树解法(Java 实现)
java·算法·leetcode·面试·线段树·力扣·
CS创新实验室8 小时前
从顺序表到动态数组:数据结构的永恒基石与现代语言的优雅封装
数据结构·算法
Black蜡笔小新9 小时前
自动化AI算法训练服务器DLTM训推一体化平台助力农业生产管理实现安全智能化
人工智能·算法·自动化
8Qi810 小时前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS10 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源
松间听晚10 小时前
Agentic RL 环境和代码学习:以HGPO为例
算法
智者知已应修善业11 小时前
【51单片机用T0定时器方式1,实现0.5S的时间间隔实现第一次一个灯亮、第二次二个灯亮,直到全部灯亮,然后重复整个过程】2023-12-29
c++·经验分享·笔记·算法·51单片机