zoukankan      html  css  js  c++  java
  • [Leetcode] 91. Decode Ways

    A message containing letters from A-Z is being encoded to numbers using the following mapping:

    'A' -> 1
    'B' -> 2
    ...
    'Z' -> 26
    

    Given an encoded message containing digits, determine the total number of ways to decode it.

    For example,
    Given encoded message "12", it could be decoded as "AB" (1 2) or "L" (12).

    The number of ways decoding "12" is 2.

    题目大意:字母 'A'可以用1表示,B可以用2表示,以此类推,Z可以用26表示。然后给你一串数字,计算出有多少种方式可以解码成字母。比如说 12,既可以解码成A B(1 2),也可以解码成L(12)。

    大致思路:由于当前s[i]转换成字母与s[i-1]有关,即当s[i-1]s[i]组成的数大于10小于27(不包括20)时,是有两种情况可以解码的。其他情况,则只能解码成1中情况,或者无法解码(比如相邻为00或者40等等)。

    下面程序中:dp[i]表示s[0]到s[i-1]能解码的个数。

    class Solution {
    public:
        int numDecodings(string s) {
            int n=s.size();
            if(n==0) return 0;//输入为空的情况
            vector<int> dp(n+1,1);
            if(s[0]=='0') return 0;//s[0]='0'的情况
            else dp[1]=1;
            for(int i=1;i<n;i++)
            {
                if(s[i]=='0') 
                {
                    if(s[i-1]<'3'&&s[i-1]>'0') dp[i+1]=dp[i-1];//出现10,20的情况
                    else return 0;//出现00,30,40...的情况
                }
                else if(s[i-1]=='1'||(s[i-1]=='2'&&s[i]<'7')) dp[i+1]=dp[i]+dp[i-1];//当是s[i-1]s[i]组成的数大于10小于27时
                else dp[i+1]=dp[i];//组成的数 小于10 或者 大于26时
                
            }
            return dp[n];
        }
    };
  • 相关阅读:
    poj1978
    poj3505
    免费专利讲座
    没有找到MFC80UD.DLL"没有找到MFC80UD.DLL,
    新手学C++/CLI及C#
    怎样激发技术人员的创新力?
    关于大型asp.net应用系统的架构—如何做到高性能高可伸缩性
    绝好的一套针对初学者的JavaScript教程
    VC如何将自身进程提升至管理员权限
    如何寻找优秀的专利代理人
  • 原文地址:https://www.cnblogs.com/hejunlin1992/p/7594683.html
Copyright © 2011-2022 走看看