*[Lintcode] Decode Ways

来源:互联网 发布:dijkstra算法求解过程 编辑:程序博客网 时间:2024/06/05 10:06

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.

Example

Given encoded message 12, it could be decoded as AB (1 2) or L (12).
The number of ways decoding 12 is 2.

类似于动态规划,每次取前1个字母或两个字母,取两个时判断是否小于26. 注意考虑出现0的情况。

public class Solution {    /**     * @param s a string,  encoded message     * @return an integer, the number of ways decoding     */    public int numDecodings(String s) {        if(s.length() == 0) return 0;        else return helper(s);    }        private int helper(String s) {        //add 1 at the end        if(s.length() == 0) return 1;        if(s.length() == 1 && Integer.parseInt(s.substring(0, 1)) != 0) return 1;                int res = 0;        if(Integer.parseInt(s.substring(0, 1)) == 0) return 0;        else {            int tmp = Integer.parseInt(s.substring(0, 2));                        int count = 0;            if(tmp <= 26) {                count = helper(s.substring(2));            }                        return helper(s.substring(1)) + count;        }      }}

结果超时。只能使用一维数组。虽然原理相同,但是一维数组用加法代替了递归的步骤,所以更加快速


public class Solution {    /**     * @param s a string,  encoded message     * @return an integer, the number of ways decoding     */    public int numDecodings(String s) {        if(s.length() == 0 || s == null) return 0;        if(s.charAt(0) == '0') return 0;                int[] res = new int[s.length() + 1];        //start from 1, keep two elements before cursor because if we get 31 in i position, we need i-2 value        res[0] = 1;        res[1] = 1;        for(int i = 2; i <= s.length(); i++) {            if(s.charAt(i - 1) > '0' && s.charAt(i - 1) <= '9') res[i] = res[i - 1];            int tmp = Integer.parseInt(s.substring(i - 2, i));            if(s.charAt(i - 2) != '0') {                if(tmp > 0 && tmp <= 26){                    res[i] += res[i - 2];                }              }        }        return res[s.length()];    }    }


0 0
原创粉丝点击