一天算法(2019-12-6)解码方法、不同路径

解码方法

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

'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:

输入: "12"
输出: 2
解释: 它可以解码为 "AB"1 2)或者 "L"12)。
示例 2:

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

思路

  • 先考虑特殊情况:第一位为0,空,连续两个为0跟0前面一个数大于2
上面三种情况结果都是0
  • 使用动态规划的思想
我们假设d[i]表示第1个到第i个字符的解码情况数(i>2)
那么我们考虑状态转移方程:如何由第i前面的字符推到第i个
显然,第i个要么是i-1个加一个字符或者i-2的时候加一个字符
需要满足的条件是:
	d[i] = s[i] == '0'? 0 : d[i-1] #s[i]==0的时候,由s[i-1]加一个字符不可以到s[i]
	d[i] += d[i-2] #s[i-2]等于'1' 或者 等于'2'但是s[i-1]<='6'

代码

    public static int numDecodings(String s) {
        if (s.isEmpty() || s.charAt(0) == '0') {
            return 0;
        }
        int b1 = 1, b2 = 1;
        for (int i = 1; i < s.length(); ++i) {
            if (s.charAt(i) == '0') {
                b1 = 0;
            }
            if (s.charAt(i - 1) == '1' || (s.charAt(i - 1) == '2' && s.charAt(i) <= '6')) {
                b1 = b1 + b2;
                b2 = b1 - b2;
            } else {
                b2 = b1;
                # 如果第i-1跟i-2都不能到达i,则结束
                if (b1 == 0 && b2 == 0) {
                    return 0;
                }
            }
        }
        return b1;
    }

不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
在这里插入图片描述
这个简单一点,直接动态规划,压缩空间
d[i] = d[i]+d[i-1]

public static int uniquePaths(int m, int n) {
        if (m > n) {
            int tem = m;
            m = n;
            n = tem;
        }
        int[] a = new int[m];
        Arrays.fill(a, 1);
        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                a[j] += a[j - 1];
            }
        }
        return a[m - 1];
    }

发布了75 篇原创文章 · 获赞 12 · 访问量 3445

猜你喜欢

转载自blog.csdn.net/weixin_44737877/article/details/103420137
今日推荐