Decode Ways

来源:互联网 发布:福清广电网络客服电话 编辑:程序博客网 时间:2024/05/16 14:07
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' -> 26Given 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 stubSystem.out.println(numDecodings("24726"));}}

0 0
原创粉丝点击