解码方法

博客围绕包含数字的非空字符串解码方法总数的计算展开。给出编码规则,如 'A' 对应 1 等。通过样例展示不同输入的解码结果,还对解题进行分析,考虑特殊情况和一般情况,给出判断条件和计算逻辑。

题目描述:

一条包含字母 A-Z 的消息通过以下方式进行了编码:
‘A’ -> 1
‘B’ -> 2

‘Z’ -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。

样例:

输入: “226”
输出: 3
解释: 它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。
输入: “026”
输出: 0

分析:

这道题和把数字翻译成字符串那道题类似,只是不再对数字0编码,所以我们在边界条件的判定时要注意。
首先考虑特殊情况,当字符串长度小于1或者字符串的首字符是0时返回0;否则当字符长度为1时返回1.
然后处理一般情况,保存当前字符的最大翻译次数,以及前一个字符和前前一个字符的最大翻译次数,如果当前字符为0,判断他的前一个字符是否也为0或者大于2,这种情况直接返回0,无法解码;否则令cur=前前一个字符的最大翻译次数。如果当前字符不为0,首先将前一个字符的最大翻译次数赋给当前字符即cur=before,然后判断当前字符和前一个字符组成的数字是否在1-26区间中,如果满足cur继续累加pre。

//执行用时 : 3 ms, 在Decode Ways的Java提交中击败了75.57% 的用户
//内存消耗 : 34.4 MB, 在Decode Ways的Java提交中击败了49.25% 的用户
     public int numDecodings(String s) {
		if(s.length() < 1 || s.charAt(0) == '0')
			return 0;
		if(s.length()==1)
			return 1;
		int pre=1,before=1,cur=0;
		for(int i=1;i<s.length();i++) {
			if(s.charAt(i)=='0') {
				if(s.charAt(i-1)=='0'||s.charAt(i-1)>'2')
					return 0;
				cur=pre;
			}else {
				cur=before;
				if(s.charAt(i-1)=='1'||s.charAt(i-1)=='2'&&s.charAt(i)<='6')
					cur+=pre;
			}
			pre=before;
			before=cur;
		}
        return cur;
	}
public int numDecodings2(String s) {
		if(s.length() < 1 || s.charAt(0) == '0')
			return 0;
         if(s.length()==1)
             return 1;
		int n = s.length();
		int dp[]=new int[n+1];
		dp[0]=1;
		if(s.charAt(1)=='0')
			dp[1]=0;
		else
			dp[1]=1;
		for(int i=1;i<n;i++) {
			if(s.charAt(i)=='0') {
				if(s.charAt(i-1)>'2'||s.charAt(i-1)==0)
					return 0;
				dp[i+1]=dp[i-1];
			}else {
				dp[i+1]=dp[i];
				if(s.charAt(i-1)=='1' || (s.charAt(i-1)=='2' && s.charAt(i)<='6'))
					dp[i+1]+=dp[i-1];
			}
		}
		return dp[s.length()];
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值