難度中等412收藏分享切換爲英文關注反饋
一條包含字母 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) 。
解題思路:首先要想到是斐波那契數列,噹噹前位置可以和前面字符結合,如前面是1,當前是2。 12可以拆開也可以結合。因此
遍歷到當前Fn=Fn-1+Fn-2,但是如果不可以和前面字符結合,如2,7,當前Fn=Fn-1,Fn-1=Fn-2。
此外,就是要處理0,因爲0決定了字符串合法與否,並且合法字符串的0一定會與前面的字符相結合,刪除掉不會影響最終結果。
class Solution {
public static int numDecodings(String s) {
int pre1 = 1;
int pre2 = 1;
//不合法字符串 如30
for(int i=0;i<s.length();i++){
if(s.charAt(i)==48){
if(i==0||s.charAt(i-1)>50||s.charAt(i-1)==48){
return 0;
}
}
}
//消0,0比較特殊,因爲0一定會和前一位配對,該字母不影響結果。
String s1 = new String();
int judge=0;
for (int i = 0; i < s.length() - 1; i++) {
if (s.charAt(i + 1) != '0') {
s1+=String.valueOf(s.charAt(i));
} else {
judge=1;
i++;
}
}
if(s.charAt(s.length()-1)!='0') {
s1+=s.charAt(s.length()-1);
}
if (s1.length() == 0||s1.length()==1 ) {
return Math.max(judge,s1.length());
}
//變形的斐波那契數列
for(int i=1;i<s1.length();i++){
int tmp=0;
if(pair(s1.charAt(i-1),s1.charAt(i))){
tmp=pre1+pre2;
pre1=pre2;
pre2=tmp;
}
else{
pre1=pre2;
}
}
return pre2;
}
public static boolean pair(char a,char b){
if(a==50&&b<55){
return true;
}
if(Integer.valueOf(a)==49) {
return true;
}
return false;
}
}