91. Decode Ways

来源:互联网 发布:怎么添加js 编辑:程序博客网 时间:2024/04/27 23:54

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.

分析摘自:

http://www.cnblogs.com/lihaozy/archive/2012/12/30/2839964.html

https://segmentfault.com/a/1190000003813921



每次对于当前的字符判断是否属于1-9(0肯定不行,因为0不在1-26中),如果属于,那么当前的字符可以被decode,并且和f[n-1]组合,f[n] += f[n-1]
然后对于当前字符和前一个字符组成的字符串判断是否属于10-26,如果属于,那么这两个字符可以被decode,并且和f[n-2]组合,f[n] += f[n-2]


解码是有规律的,所以我们可以尝试动态规划。假设数组dp[i]表示从头到字符串的第i位,一共有多少种解码方法的话,那么如果字符串的第i-1位和第i位能组成一个10到26的数字,说明我们是在第i-2位的解码方法上继续解码。如果字符串的第i-1位和第i位不能组成有效二位数字,而且第i位不是0的话,说明我们是在第i-1位的解码方法上继续解码。所以,如果两个条件都符合,则dp[i]=dp[i-1]+dp[i-2],否则dp[i]=dp[i-1]

注意

如果出现无法被两位数接纳的0,则无法解码,我们可以在一开始就判断,并将其初始化为0,这样后面的相加永远都是加0


public static int numDecodings(String s){if (s.length() == 0)return s.length();int[] dp = new int[s.length() + 1];dp[0] = 1;dp[1] = s.charAt(0) == '0' ? 0 : 1;for (int i = 2; i <= s.length(); i++){int num=Integer.parseInt(s.substring(i - 2, i));if(num>=10&&num<=26){dp[i] += dp[i - 2];}if (s.substring(i - 1, i).compareTo("0") != 0){dp[i] += dp[i - 1];}}return dp[s.length()];}


0 0
原创粉丝点击