解码序列-真实面试题

vector<string> numDecodingsList(string s) {
        vector<string> dp;
        vector<string> dp_pre;//一开始为空,等到for执行1次就有了
        if(s.length()<=0) return dp;
        if(s[0]-'0'>=1 && s[0]-'0'<=26){
            dp.push_back(string(1,s[0]));//char初始化一个string,需要两个参数,char长度和char
        }else return dp;//如果第一个数字是0,无法解开,返回0

        for(int i=1;i<s.length();i++){// 如果当前元素在1-26内,sum+=dp[i-1];如果i-2大于等于0,且两个数字连着在1-26之内
            vector<string> new_dp;
            if(s[i]-'0'>=1 && s[i]-'0'<=26){

                for(string j:dp){
                    new_dp.push_back(j+" "+string(1,s[i]));
                }

            }
            if(stoi(s.substr(i-1,2))>=1 && stoi(s.substr(i-1,2))<=26 && s[i-1]!='0'){//不用判定两位数的第一位非0
                if(i>=2){
                    for(string j:dp_pre){
                        new_dp.push_back(j+" "+s.substr(i-1,2));//dp[i-2]和当前两位数拼接
                    }
                }else{
                    new_dp.push_back(s.substr(i-1,2));//当前两位数
                }
            }
            dp_pre = dp;//dp[i-2]
            dp = new_dp;//dp[i-1]
        }
        return dp;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值