执行结果:
通过
显示详情
执行用时 :1 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗 :37.8 MB, 在所有 Java 提交中击败了5.07%的用户
题目:
一条包含字母 A-Z 的消息通过以下方式进行了编码:
'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入: "226"
输出: 3
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-ways
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
动态规划,首先定义dp[i]的意思,它的意思位前i个有多少种。
然后设定初始值dp[0]=1,dp[1]=1,初始值的设定举几个例子就好了
然后根据各种情况讨论递推公式。(见代码)
代码:
class Solution {
public int numDecodings(String s) {
if(s.charAt(0)=='0')
{
return 0;
}
int[] dp=new int[s.length()+1];
dp[0]=1;
dp[1]=1;
for(int i=2;i<=s.length();i++)
{
if(s.charAt(i-1)=='0')
{
if(s.charAt(i-2)=='1'||s.charAt(i-2)=='2')
{
dp[i]=dp[i-2];
}else
{
return 0;
}
}else if(s.charAt(i-2)=='1'||(s.charAt(i-2)=='2'&&s.charAt(i-1)>='1'&&s.charAt(i-1)<='6'))
{
dp[i]=dp[i-1]+dp[i-2];
}else
{
dp[i]=dp[i-1];
}
}
return dp[s.length()];
}
}