随笔 - 112  文章 - 0  评论 - 0  阅读 - 1426

字符串解码(栈)

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

 

示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"

示例 2:

输入:s = "3[a2[c]]"
输出:"accaccacc"

示例 3:

输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"

示例 4:

输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"

 

该题的难点在于遇到左括号与右括号该做什么

遇到左括号:将当前的数字和字符串压入栈中,并进行相应的重置

遇到右括号:将栈顶数字弹出,并重复当前字符串,然后拼接到栈顶字符串,并弹出。

所以遇到左括号要对数字栈和字符串栈插入元素,遇到右括号要对数字栈和字符串栈弹出栈顶元素

复制代码
class Solution {
public:
    string decodeString(string s) {
        int num=0;
        stack<int> numStack;
        stack<string> strStack;
        string currentStr = "";
        for(char c:s){
            if(c>='0'&&c<='9'){//是数字
                num = num*10 +(c-'0');
            }else if(c>='a'&&c<='z'){//是小写字母
                currentStr +=c;
            }else if(c=='['){
                 // 遇到'[',将当前字符串和数字压入各自的栈
                strStack.push(currentStr);
                numStack.push(num);
                // 重置currentStr和num
                currentStr = "";
                num = 0;
            }else if(c==']'){
                // 遇到']',弹出数字并重复当前字符串
                int repeatTimes = numStack.top();
                numStack.pop();
                string temp = currentStr;
                for(int i=1;i<repeatTimes;i++){
                    temp+=currentStr;
                }
                //将重复后的字符串添加到上一层的字符串后面
                currentStr = strStack.top()+temp;
                strStack.pop();
            }
        }
        return currentStr;
    }
};
复制代码

 

posted on   _月生  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示