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 );
    }
相关推荐
玖玥拾6 小时前
LeetCode 392 判断子序列
笔记·算法·leetcode
重生之后端学习8 小时前
239. 滑动窗口最大值[困难]✅
java·数据结构·算法·leetcode·职场和发展
fpcc8 小时前
算法和数据结构—动态规划法
数据结构·算法·动态规划
星星.72210 小时前
C++算法竞赛|二分查找与二分答案:边界模板、浮点二分、STL
数据结构·c++·算法
sel_910 小时前
【OPD论文导读(二)】OPD(On-Policy Distillation)全景调研:十篇论文讲透“在自己生成的内容上学习“这件事
人工智能·python·深度学习·学习·算法·语言模型
金幄科技11 小时前
RAG第四篇:重排序 Rerank——粗召回之后,为什么还需要一次精排
人工智能·算法·ai·ai编程
M78佐菲11 小时前
Linux学习笔记:文件IO
linux·笔记·学习·算法
lhldsg12 小时前
课程排课系统实战指南:从数据库设计到算法调优全流程解析
java·数据库·算法·小程序
BSD_HY12 小时前
薄膜开关矩阵扫描电路设计中的防鬼键措施
人工智能·算法·矩阵·人机交互·薄膜开关·源头工厂·深圳工厂
linux-hzh12 小时前
百日算法修炼 · Day 17
数据结构·算法