leetcode || 91、Decode Ways

来源:互联网 发布:an软件 编辑:程序博客网 时间:2024/05/21 06:49

problem:

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.

Hide Tags
 Dynamic Programming String
题意:A~Z分别编码到1~26,反过来,1~26也可以解码到A~Z,给定一个包含0~9的字符串,求其解码到包含A~Z的字符串的方式有多少

thinking:

(1)这道题很经典,很考察 DP、边界条件,我调试了一个小时才 AC

(2)这道题不是要一一列出解码出来的字符串,而是求解码的方法数。采用深搜的方法可以一一打印出来解码后的字符串,但是对于该题时间复杂度坑定会超时。

(3)采用DP,开一个n大小的数组记录DP的最优子结构的解。DP的难点在于寻找状态转移方程

if(s.at(i)=='0')            {                if(s.at(i-1)=='1'||s.at(i-1)=='2')                {                    a[i]=a[i-2];                    continue;                }                else                     return 0;                }            if(s.at(i-1)=='1' ||(s.at(i-1)=='2'&&(s.at(i)>'0'&&s.at(i)<'7')) )                a[i]=a[i-2]+a[i-1];            else                a[i]=a[i-1];
从左往右遍历字符串,对于第i个数字怎么解码,要看第i、i-1能否一起解码。

例如,当我们知道了n-2长度的字符串能够解释的数目以及n-1长度的字符串能够解释的数目时,我们可以判读如下两个条件:
1)若第n个字符在1到9之间,则n长度的字符串能够解释的数目包含n-1长度字符串能够解释的数目。
2)若第n-1个字符与第n个字符可以解释为一个字母时,则n长度的字符串能够解释的数目包含n-2长度字符串能够解释的数目。

code:

class Solution {public:    int numDecodings(string s) {        int n=s.size();        vector<int> a(n,0);        if(n==0)            return 0;        if(s.at(0)=='0')            return 0;        if(n==1)                return 1;        a[0]=1;        if(s.at(1)=='0')        {            if(s.at(0)=='1' || s.at(0)=='2')                a[1]=1;            else                a[1]=0;        }        else if(s.at(0)=='1' || (s.at(0)=='2'&&(s.at(1)>'0'&&s.at(1)<'7')))            a[1]=2;        else            a[1]=1;        if(n==2)            return a[1];        for(int i=2;i<n;i++)        {            if(s.at(i)=='0')            {                if(s.at(i-1)=='1'||s.at(i-1)=='2')                {                    a[i]=a[i-2];                    continue;                }                else                     return 0;                }            if(s.at(i-1)=='1' ||(s.at(i-1)=='2'&&(s.at(i)>'0'&&s.at(i)<'7')) )                a[i]=a[i-2]+a[i-1];            else                a[i]=a[i-1];        }        return a[n-1];    }};


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 打开cad浏览器闪退怎么办 dnf进游戏闪退怎么办 苹果8出现闪退怎么办 手机浏览器老是自动打开软件怎么办 打开手机浏览器为什么是英文怎么办 ie浏览器删除掉了怎么办 手机360浏览器卸载不掉怎么办 大学素质拓展学分不够怎么办 专升本学分不够怎么办 电脑连接无线网络网关禁用怎么办 背部毛孔粗大有黑头怎么办 毛孔变粗大长痘怎么办 皮肤粗糙暗黄毛孔大怎么办 毛孔粗大还有痘印怎么办 高一的不爱上数学怎么办 监狱系统需要体测怀孕怎么办 货运从业资格证年审过期了怎么办 科三线路记不住怎么办? 汽车大灯里面起雾水怎么办 二级重伤对方法庭拒绝赔偿怎么办? 在麦当劳工作收到假钞怎么办 东西湖小学分配太远怎么办 农行k令过期了怎么办 穿军训的鞋捂坏了怎么办 联通手机号销户话费怎么办 建行员工所持有的原始股怎么办 孕妇喝了午时茶怎么办 苹果6id被锁了怎么办 苹果手机app密码忘了怎么办 好哥们借钱手上没钱怎么办 武汉ca证书u盾怎么办 判了刑发现还有漏案没判怎么办 高铁旅客漏乘怎么办 水库里面要养殖小龙虾最好怎么办 点读机的笔丢了怎么办 皮肤晒的很黑怎么办 电脑wifi连接受限制怎么办 高中孩子班管理松怎么办 脱式计算有余数怎么办 手机被别人绑定微信怎么办 饿了么入职查不到学历怎么办