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 );
    }
相关推荐
小欣加油2 小时前
leetcode2078 两栋颜色不同且距离最远的房子
数据结构·c++·算法·leetcode·职场和发展
我真不是小鱼2 小时前
cpp刷题打卡记录30——轮转数组 & 螺旋矩阵 & 搜索二维矩阵II
数据结构·c++·算法·leetcode
逻辑驱动的ken3 小时前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表
帅小伙―苏4 小时前
力扣42接雨水
前端·算法·leetcode
AI科技星4 小时前
精细结构常数α的几何本源:从第一性原理的求导证明、量纲分析与全域验证
算法·机器学习·数学建模·数据挖掘·量子计算
6Hzlia4 小时前
【Hot 100 刷题计划】 LeetCode 287. 寻找重复数 | C++ 数组判环 (快慢指针终极解法)
c++·算法·leetcode
MegaDataFlowers4 小时前
26.删除有序数组中的重复项
算法
故事和你915 小时前
洛谷-数据结构1-4-图的基本应用2
开发语言·数据结构·算法·深度优先·动态规划·图论
吴可可1236 小时前
C#合并首尾相连多段线实战
算法·c#