LeetCode 394. Decode String

题解

看到括号很容易想到栈。用stack的思路就是每遇到一个 ],不停出栈直到
遇到对应的 [ 再出栈把数字倒出来。大体思路就是这样。

当然我们不需要显式的用stack,用递归也是一样的,我的解法就是递归。

这里给几点tips:

  1. 递归解法是想把原问题分解为小问题,这题的所谓小问题就是
    decode 一个[]内的字符串。
  2. 注意只要有数字就会有[],每个[]内可能有数字也可能没有,但必然
    会有字母。
  3. 如何设计 dfs 函数有点讲究,我们dfs只解决一个[]内的字符串。

Code

class Solution {
public:
    string ts;
    int n;
    string decodeString(string s) {
        n = s.size();
        ts = s;
        
        int k=0;
        return dfs(k);
    }
    
    string dfs(int &p){// 注意这个引用的p,有两个作用。一是提示开始,二是作返回值
        int pos = p,ed;// 我们让他返回最后的位置,便于跳过递归过的位置
        string str("");
        char c;
        int num=0;
        while(ts[pos]!=']' && pos <n){
            c = ts[pos];
            if(isdigit(c)){
                num*=10;
                num+= c-'0';
            }else if(isalpha(c)){
                str+=c;
            }else if( c=='['){// key point
                ed = pos+1;
                string tmp = dfs(ed);
                for(int i=0;i<num;i++) str+=tmp;
                pos = ed+1;
                num=0;
                continue;
            }   
            pos++;
        }   
        p = pos;
        return str;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值