LeetCode -- 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 encoded message "12", it could be decoded as "AB" (1 2) or "L" (12).
The number of ways decoding "12" is 2.


就是给定1个由数字组成的字符串。依照相应关系(1-A,2-B...)完毕解码,共同拥有多少种解码方式。
1. 确定问题范围,也就是s中每个字符s[i]的取值范围
-s[0]不能为0或大于2
-s中不能连续出现两个0


2. 找规律
在满足取值范围的情况下,设a[i]为s中第i个字符的解码可能数,当中i∈[0,n)
a[0] = 1;
a[1] = s[1] != 0 时为  2 否则为 1;
a[2] : 
s[2] 不为0时 a[2] += a[1] 。 
s[0]和s[1]能够组成10-26中的一个数时 a[2] += a[0]


因此,对于a[n]。  
s[n] != 0 时 ,a[n] += a[n-1] ; 
s[n-1]与s[n]可组成10-26 时。 a[n] += a[n-2];


对于长度为n的字符串,最后解为a[n-1].


实现代码:



public class Solution {
 public int NumDecodings(string s) 
 {
     if(string.IsNullOrWhiteSpace(s)){
	 	return 0;
	 }
	 
	 if(s.Length == 1){
	 	return s == "0" ? 0 : 1;
	 }
	 if(s[0] == '0' || s[0] >= '3'&& s[1] == '0'){
	 	return 0;
	 }
	 
	 if(s.Length == 2){
	 	return s[1] == '0' || !ok(s[0],s[1]) ? 1 : 2;
	 }
	 
	 var arr = new int[s.Length];
	 arr[0] = 1;
	  arr[1] = s[1] == '0' || !ok(s[0], s[1]) ? 1 : 2;
	 
	 for(var i = 2;i < s.Length; i++){
	 	if(s[i-1] == '0' && s[i] == '0'){
			return 0;
		}
		
	 	if(s[i] != '0'){
			arr[i] += arr[i-1];
		}
		if(ok(s[i-1], s[i])){
			arr[i] += arr[i-2];
		}
	 }
	 
	 return arr[s.Length-1];
 }
 
 private bool ok(char c1 , char c2){
 if(c1 == '0'){
 return false;
 }
 if (c1 == '1' || c1 == '2' && c2 <= '6'){
 return true;
 }
 return false;
 }
}


posted on 2017-05-14 08:41  slgkaifa  阅读(130)  评论(0编辑  收藏  举报

导航