解码方法
一条包含字母 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];
}