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.
思路:f[i] 表示前i位string可以表示的decode ways,f[0] = 1表示第0位,空串只有一种表示,
个位 1~9,0不行
十位 0 不行,27~99 也不行。其余都可以;
f[i] = f[i-1] 如果s[i-1]合法+ f[i-2] 如果s[i-2 , i -1] 合法
注意因为dp是n+ 1, 所以,i是加了1的,所以i = 1, 相当于string里面的charAt(0)
class Solution {
public int numDecodings(String s) {
int n = s.length();
// dp[i] = dp[i - 1] + dp[i - 2];
int[] dp = new int[n + 1];
dp[0] = 1; // 空串只有一种表示方法,因为递归,必须要有个起点;
for(int i = 1; i <= n; i++) {
if(isvalid(s.substring(i - 1, i))) {
dp[i] += dp[i - 1];
}
if(i - 2 >= 0 && isvalid(s.substring(i - 2, i))) {
dp[i] += dp[i - 2];
}
}
return dp[n];
}
private boolean isvalid(String str) {
if(str == null || str.startsWith("0")) {
return false;
}
int num = Integer.parseInt(str);
return 1 <= num && num <= 26;
}
}