F_G

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

[Leetcode] Decode Ways

Decode Ways

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.

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.

这里主要是要分好类:

一、当前字符是0的情况

如果前一个字符是1,2则合法,并且num[i]= num[i-2],因为10,20不可分割

其他都是非法的return 0 即可

二、当前字符不是0的情况

这里也分为两种,当前字符可以和前面的字符合并的情况,和不能合并的情况

1、能进行合并 2[1,6],1[1,9]

2、不能进行合并 [3,9]X!=0,2[7,9],0X!=0

上代码

 1 public class Solution {
 2     public int numDecodings(String s) {
 3         if(s==null||s.length()==0) return 0;
 4         if(s.length()==1&&s.charAt(0)!='0') return 1;
 5         else if(s.length()==1&&s.charAt(0)=='0') return 0;
 6         //at least 2 characters
 7         int [] nums = new int[s.length()];
 8         char c1 = s.charAt(0);
 9         char c2 = s.charAt(1);
10         if(c1=='0') return 0;
11         else nums[0]=1;
12         if(c2=='0'){
13             if(c1=='1'||c1=='2') nums[1]=1;
14             else return 0;
15         }else if(c1=='2'&&(c2<='6'&&c2>='1')){
16             nums[1]=2;
17         } else if(c1=='1'){
18             nums[1]=2;
19         }else{
20             nums[1]=1;
21         }
22         for(int i=2;i<s.length();i++){
23             char c = s.charAt(i);
24             char pre = s.charAt(i-1);
25             //当前为0
26             if(c=='0'){
27                 if(pre=='1'||pre=='2') nums[i]=nums[i-2];
28                 else return 0;
29             }
30             //当前不是0
31             else if(pre=='2'&&(c<='6'&&c>='1')){//2[1,6]
32                 nums[i]=nums[i-1]+nums[i-2];
33             }else if(pre=='1'){//1[1,9]
34                 nums[i]=nums[i-1]+nums[i-2];
35             }else if(pre>='3'&&pre<='4'){//[3,4]X!=0
36                 nums[i]=nums[i-1];
37             }else {
38                 nums[i]=nums[i-1];
39             }
40             //上面针对当前字符不是0的情况实际上可以进行合并:总体上分为两种,当前字符可以和前面的字符合并为一个新的而数字的情况,和不能进行合并的情况
41             //合并的情况是:2[1,6],1[1,9]
42             //不能合并的情况是其他的情况:也就是[3,9]X!=0,2[7,9],0X!=0
43         }
44         return nums[s.length()-1];
45     }
46 }

 

posted on 2015-08-27 19:54  F_G  阅读(192)  评论(0编辑  收藏  举报