LeetCode 62 Decode Ways

来源:互联网 发布:点餐系统 开源 java 编辑:程序博客网 时间:2024/05/30 04:29

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.

分析:

动态规划除了在最优化问题中用到之外,在这种问题里也会用到,这种问题的特征是:

1,字符串;

2,求方法的总数

当然,如果这道题变成,求所有解码的结果集,就应该想到DFS了。


注意动态规划子问题的特点:

1,与总的问题是同质的,不同之处是规模;

2,当前解可由子问题的解推出。


就此题而言,与它类似的就是上楼梯方式的问题了。

设num[i] 是从0开始长度为 i 的子串的解耦数,子问题有两种情况,即往前推 1 位 和 2 位两种方式,直观上就是:

num[i] = num[i-1] + num[i-2]

这个问题,还要判断合法性的问题,即,如果是一位的话,不能是0,如果是两位的话,前面一位不能是0 同时两位数的值要在1和26之间。如果两种情况有那种是不成立的,就不用加这种情况的结果了。

所以在递推之前,要对合法性进行检查。

public class Solution {    public int numDecodings(String s) {        if(s == null || s.length() == 0 || s.charAt(0) == '0')            return 0;        int[] number = new int[s.length()+1];        number[0] = number[1] = 1;        int tmp;        for(int i=2; i<= s.length(); i++){            //one存放1位的情况,如果1位是合法的,one=number[i-1],            //否则,one=0            //two存放2为的情况,如果2位是合法的,two=number[i-2],            //否则,two=0            int one=0, two=0;            tmp = Integer.parseInt(s.substring(i-1, i));            if(tmp != 0)                one = number[i-1];            if(s.charAt(i-2) != '0'){                tmp = Integer.parseInt(s.substring(i-2, i));                if(tmp>=1 && tmp<=26)                    two = number[i-2];             }            number[i] = one+two;        }        return number[s.length()];    }}




0 0
原创粉丝点击