題目描述
一條包含字母 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) 。
具體解法就是動態規劃,看註釋吧,判斷情況都說明了
class Solution {
public int numDecodings(String s) {
//以0開頭的字符串,0是非法字符,只有在“10”,“20”這兩種情況下出現才合法,這裏直接0打頭,攤牌了,沒法玩了
if(s.charAt(0)=='0') {
return 0;
}
int[] dp=new int[s.length()];
//單獨一個不是0的數字(1~9)必合法
dp[0]=1;
// 從第二個數字開始遍歷
for(int i=1;i<s.length();i++){
//當前數字爲‘0’
if(s.charAt(i)=='0'){
//連續兩個0,整個字符串非法,沒法解
if(s.charAt(i-1)=='0') {
return 0;
} else{
if(s.charAt(i-1)>'2') {
//0前頭不是1,也不是2,非法組合(既不能和前一個合併,也不能單獨拿出來)
return 0;
} else {
//“10”或者“20”的情況,只能把10,20綁定在一起解碼
// 判斷i-2是否存在
dp[i]=i-2 < 0 ?1:dp[i-2];
}
}
//當前數字不爲0
}else{
if(s.charAt(i-1)=='0') {
//如“1309”,指到9時,9不能和前面的0組合,0只能和1綁定在一起,所以還是1種解碼方法
dp[i]=dp[i-1];
//前面數字也不是0
} else{
//判斷是否是1-26
if(Integer.parseInt(s.substring(i-1,i+1))<=26) {
dp[i]=(i-2)<0?2:(dp[i-1]+dp[i-2]);
} else {
//大於26的情況,只有1種解法,當前數字只能單獨拿出來
dp[i]=dp[i-1];
}
}
}
}
return dp[s.length()-1];
}
}