由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 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.

这是Leetcode上的题目,求数字的解码方式有多少种,可以采用的方式很多,递推、递归、动态规划。。

class Solution  
{  
public:  
    int decodeOne(char one) {
        return (one == '0') ? 0 : 1;
    }
    int decodeTwo(char one, char two) {
        if( (one == '1') || (one == '2' && two <= '6') )
            return 1;
        else
            return 0;
    }
	int fun(string s, int i) {
		if(i == 0 ) return decodeOne(s[0]);
		if(i == 1) return ( decodeOne(s[0]) & decodeOne(s[1]) ) + decodeTwo(s[0], s[1]);

		if(i >= 2) {
			int sum = 0;
			if(decodeOne(s[i])) sum += fun(s, i-1);
			if(decodeTwo(s[i-1], s[i]) ) sum += fun(s, i-2);
			return sum;
		}
	}
 
    int numDecodings(string s) 
    {
        if(s.size() == 0 || s[0] == '0') return 0;
        return fun(s, s.size() - 1);
    }
};
主要讨论下面这段代码:

			int sum = 0;
			if(decodeOne(s[i])) sum += fun(s, i-1);
			if(decodeTwo(s[i-1], s[i]) ) sum += fun(s, i-2);
			return sum;

这里要求的是f(n)的值,它依赖于f(n-1) 和 f(n-2) 、同时跟两个判断条件有关。s[i] 能否解码、s[i-1]能否解码、s[i-1]s[i]两位数能否解码,决定了f(n) 如何跟f(n-1) f(n-2)建立联系,那么会出现的状况有很多种,分析出来写成代码会很难看,因为状况多、给人感觉思路不清。 由于是计数,可以采用累加的方法,当s[i]可以解码的时候出现了多少情况,当s[i-1]s[i]两位数可以解码出现了多少情况,依次算加法加起来,这样不用分析组合状态,只用分析单个状态就能得出结果。

        横向思维:将问题分成多种情况,针对每种情况提出方案。

        纵向思维:将问题考虑成一种情况,对过程中的不同情况做处理。

PS:本题用 划分状态后写出来的代码要么难看,要么难懂!@#¥#@~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值