Leetcode OJ 91 Decode Ways [Medium]

Leetcode OJ 79 Word Search [Medium]

《剑指offer》第5章(3)

题目描述:

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

'A' -> 1

'B' -> 2

...

'Z' -> 26

Given an encoded message containing digits, determine thetotal number of ways to decode it.

For example,
Given encoded message"12", it could be decoded as "AB" (1 2) or "L"(12).

The number of ways decoding "12" is 2.

 

题目理解:

字母A用1表示,B用2表示,依次类推,Z用26表示,给定一串数字字符串,求该数字字符串代表多少种字母序列。

测试用例:

功能测试:1位数字;多位数字;包含25的数字;包含26的数字;包含‘0’

边界测试:输入的字符串为空“”;负数;输入“0”返回0;

分析:

1.  递归的思想是‘12345’可分解成‘1’‘2345’和‘12’‘345’,而‘2345’可分解成‘2’‘345’,会出现重复子问题,提交超时;

2.  解决递归思路出现的重复子问题,改变递归的从上往下思想,转而从下往上解决问题,先解决小问题,在解决组合起来的大问题,在这里即是从后往前转换数字;

3.  同时考虑输入中出现‘0’的情况(101:1,110:1,10:1,01:0,012:0,100:0);

4.  用循环实现:

    当前数字索引是i,one表示从i+1开始的转换,two表示从i+2开始的转换;

    当i处的数字不是0时,从i开始的转换=i+1开始的转换+(当i到i+1小于26时,i+2开始的转换);

    当i处数字是0时,从i开始的转换=0;

    更新two和one:two = one;one=result

    循环初始条件:two=1,one=0(最后一位是0)one=1(最后一位不是0);

    循环i从倒数第二位开始;

解答:

  
 class Solution {

 

    public int numDecodings(String s) {

        if(s.length() == 0) return 0;

        if(s.length() == 1){

            if(s.charAt(0) >= '1' && s.charAt(0) <= '9') return 1;

            else return 0;

        }

        int result=0,two=1,one=0,n=s.length();

        if(Integer.parseInt(s.substring(n-1,n)) > 0) one = 1;

        

       

        for(int i = s.length() - 2; i >= 0; i--){

            if(s.charAt(i) >= '1' && s.charAt(i) <= '9'){

                result = one;

                if(Integer.parseInt(s.substring(i,i+2))<= 26 && Integer.parseInt(s.substring(i,i+2))>= 1) 

                    result += two;   

            } 

            else {

                result = 0;  

            }

            two = one;

            one = result; 

            

        }

        

        return result;

    }

}

 


你可能感兴趣的:(Leetcode)