LeetCode 91. Decode Ways(递推)

题目来源:https://leetcode.com/problems/decode-ways/

问题描述

91. Decode Ways

Medium

A message containing letters from A-Z is being encoded to numbers using the following mapping:

'A' -> 1

'B' -> 2

...

'Z' -> 26

Given a non-empty string containing only digits, determine the total number of ways to decode it.

Example 1:

Input: "12"

Output: 2

Explanation: It could be decoded as "AB" (1 2) or "L" (12).

Example 2:

Input: "226"

Output: 3

Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).

------------------------------------------------------------

题意

规定大写英文字母与数字字符串的对应关系如下:

“A” -> “1”

“B” -> “2”

“Z” -> “26”

给出一个数字字符串s,求字符串有多少种不同的英文字母编码表示。

------------------------------------------------------------

思路

递推。用dp[i]表示s[0:i]的英文编码种数,

dp[i] =    dp[i-1]+dp[i-2],     s[i-1:i] == “11” ~ “26”

              dp[i-1],                 s[i-1:i] == 大于26且没有0的数字

              dp[i-2],                 s[i-1:i] == “10”, “20”

              dp[i-1],                 s[i-1:i] == “01” ~ “09”

              return 0,                s[i-1:i] == “00”, “30” ~ “90”

------------------------------------------------------------

代码

class Solution {
    public int numDecodings(String s) {
        int n = s.length();
        if (s == null || n == 0)
        {
            return 0;
        }
        int dp = 0, dp1 = 0, dp2 = 1;
        if (s.charAt(0) == '0')
        {
            dp1 = 0;
        }
        else
        {
            dp1 = 1;
        }
        if (n == 1)
        {
            return dp1;
        }
        for (int i=1; i<n; i++)
        {
            if (s.charAt(i-1) == '0' && s.charAt(i) == '0')
            {
                return 0;
            }
            else if (s.charAt(i-1) == '0')
            {
                dp = dp1;
            }
            else if (s.charAt(i) == '0' && s.charAt(i-1) >= '3')
            {
                return 0;
            }
            else if (s.charAt(i) == '0')
            {
                dp = dp2;
            }
            else
            {
                Integer tmp = Integer.parseInt(s.substring(i-1, i+1));
                if (tmp>=11 && tmp<=26)
                {
                    dp = dp1+dp2;
                }
                else
                {
                    dp = dp1;
                }
            }
            dp2 = dp1;
            dp1 = dp;
        }
        return dp;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值