码迷,mamicode.com
首页 > 其他好文 > 详细

Decode Ways

时间:2015-04-19 01:04:45      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

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];
    }
}

 

Decode Ways

标签:

原文地址:http://www.cnblogs.com/NickyYe/p/4438387.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!