Stack的应用——Decode String

本文介绍了解码字符串问题的解决方法,使用栈结构辅助处理嵌套的重复子串,通过逐层解析实现正确解码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题解:

1.问题描述:给定一个编码字符串,返回它的解码字符串。编码规则是:k [encoded_string],其中方括号内的encoded_string被重复k次。 注意,k被保证为正整数。

2.解题思路:

s = "3[a2[c]]", return "accaccacc".

通过这个例子,可以看出需要从内向外逐步展开括号来得到最终的解码字符串。

参考了数据结构书上的括号匹配的算法之后,可以类似得到这道题的算法:

创建一个栈stk用来存放字符

for 字符串 s 中的每一个字符 ch

    if ch 不是右方括号 ]

        将ch压入栈中

    else 

        声明一个空串temp用来记录 [ ] 之间的内容

        while 栈顶元素不是左方括号 [ 

            temp = 栈顶元素 + temp

            弹出栈顶元素

        弹出左方括号 [

        声明一个num用来记录k

        while 栈不空且栈顶元素为数字

            在num上不断叠加

            弹出栈顶元素

        向stk中push num次的temp

声明一个空字符串ss并赋予stk中的内容

返回ss                  

   

源代码如下:     

#include <iostream>

#include <stack>
#include <string>
using namespace std;


class Solution {
public:
    string decodeString(string s) {
        stack<char> result;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!=']')
                result.push(s[i]);
            else
            {
                string temp="";
                while(result.top()!='[')
                {
                    temp=result.top()+temp;
                    result.pop();
                }
                result.pop();


                int num=0;
                int c=1;
                while(!result.empty()&&result.top()>='0'&&result.top()<='9')
                {
                    num+=(result.top()-48)*c;
                    c*=10;
                    result.pop();
                }


                for(int x=0;x<num;x++)
                {
                    for(int y=0;y<temp.size();y++)
                        result.push(temp[y]);
                }
            }
        }
        string decoded="";
        while(!result.empty())
        {
            decoded=result.top()+decoded;
            result.pop();
        }
        return decoded;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值