Decode Ways

package leetcode;

public class test {
/*
 * 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.
 * 
 * 
 * 解题思路
 * 1.异常情况作为0返回,比如出现30,40,50,。。。
 * 2.剩下的情况就是对分词的情况进行准确的判断,之前一直没有判断清楚的原因在于没有彻底搞明白
 * 2.1 接下来两个字符能够有两种情况:
 * 比如,“22”+‘4’就是有两种情况
 * 		1是在4单独为一个,所以这个时候分词的数量跟“22”的分词数量多少是一样的
 * 		2是“24”作为单独的一个,所以这个时候分词的数量跟“2”的分词数量是一样的
 * 		最终就是把上面两种相加就是最复杂情况的解决办法。
 * 		即s[i+1]=s[i]+s[i-1]
 * 		之前一直没有静下心来把这两种情况给刨根里清楚其区分点。
 * 2.2 接下来两个字符只能是一种情况
 * 		如果c[i][i+1]>26,如“27”+‘4’ ,c[1,2]="74",所以‘4’的添加跟没添加都是同样的分法,s[i+1]=s[i]
 * 		如果c[i][i+1]==10||20  那么这时候分法s[i+1]=s[i-1]
 * 		如果c[i][i+1]<10  s[i+1]=s[i]=s[i-1](如果s[i]!=0)
 * 
 * 
 * #用到动态规划,就把动态规划的本质提一下。
 * 		1.一个问题的特定子问题有多种选择集合。后面的问题选择依赖于前面的问题解决。
 * 			在这里就是可以看出“22”是前面的子问题,“224”的解决依赖于“22”的解决
 * 		2.在求解的时候可以把前一个问题当成已知 的,然后推出关系式,即f(x+1)=G(f(x))在这里,f(x+1)={f(x)+f(x-1),f(x),f(x-1),0}根据不同的条件选择不同的G(T)
 * 		3.自底向上,分别存储来解决自顶向下的递归的各种缺点 。在这里就是从f(x)中从x=0,1分别计算,然后在这两个基础上算出3,4,5,6,等
 * 
 * 
 * 
 * 
 */
	public static int numDecodings(String s) {
		int s1=0,s2=0;
		if (s.length()<2) {
			if (s.length() == 0||s=="0")
				return 0;
			if (s.length() == 1&&Integer.parseInt(s)!=0)
				return 1;
			if (s.length() == 1&&Integer.parseInt(s)==0)
				return 0;
		}else {
			if(s.charAt(0)=='0')return 0;
			if(s.length()==2){
				if(Integer.parseInt(s)%10==0&&(Integer.parseInt(s)!=10&&Integer.parseInt(s)!=20))return 0;
				if(Integer.parseInt(s)>26||Integer.parseInt(s)==10||Integer.parseInt(s)==20)return 1;
			    
				else return 2;
				
			}
			s1=numDecodings(s.substring(0,1));
			s2=numDecodings(s.substring(0,2));
			int sindex=2;
			boolean candiv=false;
			if(s2==2)candiv=true;
			while(sindex<s.length()&&s2!=0){
				int tmp=0;
				if(s.charAt(sindex)=='0'&&(s.charAt(sindex-1)!='1'&&s.charAt(sindex-1)!='2'))
					return 0;
				
				if(Integer.parseInt(s.substring(sindex-1,sindex+1))>26||Integer.parseInt(s.substring(sindex-1,sindex+1))<10){
					s1=s2;
				}
				else if(Integer.parseInt(s.substring(sindex-1,sindex+1))==10||Integer.parseInt(s.substring(sindex-1,sindex+1))==20){
					tmp=s2;
					s2=s1;
					s1=tmp;
				}
				else if(Integer.parseInt(s.substring(sindex-1,sindex+1))<=26&&Integer.parseInt(s.substring(sindex-1,sindex+1))>=11){
					tmp=s2;
					 s2+=s1;
					s1=tmp;
				}
				
				sindex++;
						
			}
			return s2;
		}
		return 0;

	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(numDecodings("24726"));
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值