题解 | #把数字翻译成字符串#

把数字翻译成字符串

http://www.nowcoder.com/practice/046a55e6cd274cffb88fc32dba695668

转载自:NC116把数字翻译成字符串_牛客博客
https://blog.nowcoder.net/n/c0a01037177b4775b632242d8dd02d73?f=comment
基本和上面的一样,这个题解作为自己的思考理解和复习用,感觉写还比较容易懂,欢迎大家交流!

// NC116把数字翻译成字符串
class Solution {
public:
    /**
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
    int solve(string nums) {
        // write code here
        /* 定义状态:
            dp[i]:以下标为i结尾的字符串的解码方式数
        状态转移:
            1、当nums[i]==0;由于0没有对应解码方式,只能和前一位nums[i-1]组合。且前一位只能为1或者2
                dp[i]=dp[i-2];(i>1) 因为最后两位如果能解码,那么它的解码数量取决dp[i-2],因为最后两位固定了
                dp[i]=1;(i=1) 因为此时只有两位数,能解码的话就只有一种方式
            2、当nums[i]!=0;
                分析2.1、当nums[i-1]为1的时候,满足要求
                分析2.2、当nums[i-1]为2的时候,判断下nums[i]是否在1-6之间,因为>26的数无法解码
                dp[i]=dp[i-1]+dp[i-2];//因为在11-26之间(20在上面已经判断完了),可以组合解码,也可以单个解码
            3、初始化
                dp[0]=1;
            4、结果返回
                dp[n-1];n为nums的长度
                 */

            //注意nums中的是字符,要注意字符转数字的方式    
        int len=nums.size();
        if(len==0) return 1;
        if(nums[0]=='0') return 0;
        vector<int>dp(len);
        dp[0]=1;
        for(int i=1;i<len;++i){
            // 如果是0结尾
            if(nums[i]=='0'){
                // 如果前一位是1或者2,也就是能组合解码
                if( nums[i-1]=='1' || nums[i-1]=='2' ){    
                    if(i==1) 
                        dp[i]=1;//如果只有两位
                    else
                        dp[i]=dp[i-2];
                }
                //如果前一位不是1或者2,那这串就解码不了,默认0    
            }else{
                //如果nums[i]!=0;
                if(  nums[i-1]=='1' || (nums[i-1]=='2' && nums[i]>='1' && nums[i]<='6' )  ){
                    if(i==1)
                        dp[i]=2;
                    else
                        dp[i]=dp[i-1]+dp[i-2];
                }else{
                    // 如果是其他条件,如果xxxx37;就只能拆开
                    dp[i]=dp[i-1];
                }
            }
        }
        return dp[len-1];
    }
};
全部评论

相关推荐

hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务