标签:
https://leetcode.com/problems/decode-ways/
A message containing letters from A-Z
is being decoded to numbers using the following mapping:
‘A‘ -> 1 ‘B‘ -> 2 ... ‘Z‘ -> 26
Given an decoded message containing digits, determine the total number of ways to decode it.
For example,
Given decoded message "12"
, it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding "12"
is 2.
解题思路:
根据“求解数量用dp,求解集合用dfs”的经验,这题应该用dp来做。
这题有点像走楼梯的题目,定义子状态dp[i]为s.substring(0, i + 1)的decode可能数量。
我们先不考虑s里面含0的情况。如果i和i-1两个字符组成的数字大于27,那么加上i后,不可能有新的decode方法,dp[i]=dp[i - 1]。否则它大于0且小于27,代表还能有一种decode可能,那么dp[i] = dp[i - 1] + dp[i - 2]。
问题是,0的出现使得这道题目比较麻烦。我的方法是,分别考虑i - 1和i是不是0,分四种情况。
1. i - 1 == 0。
1.1 如果i == 0,连续两个0,不可能被decode,直接返回0。
1.2 如果i != 0,dp[i] = dp[i - 1]。
2. i - 1 != 0
2.1 如果i != 0,套用上面的思路。
2.2 如果i == 0,在i - 1 == 1或者i - 1== 2的情况下,dp[i] = dp[i - 1]。否则,i这个地方的0无法和前面一个字符结合,作为从i往后出现的第一个0,也无法被decode,所以直接返回0。
public class Solution { public int numDecodings(String s) { int n = s.length(); if(n == 0) { return 0; } if(s.indexOf("0") == 0) { return 0; } int[] dp = new int[n]; dp[0] = 1; for(int i = 1; i < n; i++) { if(s.charAt(i - 1) == ‘0‘) { if(s.charAt(i) != ‘0‘) { dp[i] = dp[i - 1]; } else { return 0; } }else { if(s.charAt(i) != ‘0‘) { if(Integer.valueOf(s.substring(i - 1, i + 1)) <= 26) { if(i - 2 < 0) { dp[i] = 2; }else { dp[i] = dp[i - 1] + dp[i - 2]; } } else { dp[i] = dp[i - 1]; } } else { if(s.charAt(i - 1) == ‘1‘ || s.charAt(i - 1) == ‘2‘) { if(i - 2 < 0) { dp[i] = 1; }else { dp[i] = dp[i - 2]; } } else { return 0; } } } } return dp[n - 1]; } }
标签:
原文地址:http://www.cnblogs.com/NickyYe/p/4438387.html