タイトル
AZをコーディングすることによって行われる文字含むメッセージ:
- > 1「A」
「B」 - > 2
...
「Z」は- > 26れている
数字の唯一の非空の文字列を含むと判断し、復号方法の合計数を計算します。
注:このような「00」のように、場合が復号化されなくてもよいです
例
例1:
入力: "12"
出力:2
説明:それは"AB"(1 2)または"L"(12)のように復号することができます。
例2:
入力: "226"
出力:3の
説明:それは"BZ"として復号することができる(2 26)、 "VF"(22 6)、 または"BBF"(2 2 6) 。
思考
再帰
(iはビットまで復号化のいくつかのタイプのDP [i]の代表)について[N-2]我々は、DP [n]を発見し、復号化方法の数だけDP [N-1]とDP
1、s.charAt (I)== '0'、それは私が単独で復号化できないビットを示し、DP [I] = 0、又はDP [I] DP = [I-1]
図2に示すように、iビットのI-1ビット26の番号1、[I-1、i]は正規コードを構成し得る、DPので、[I] = DP [I ] + DPは[I-2]、 変更されないであろう
注(:ステップIは、ISを書い順序は、そうでない式が変更されますが、考え方は理解されている、あなたが書くべきそれを変更する方法)
(実際には、再帰も行うが、そう感動しません、タイムアウトになりました)
実際には、我々は唯一の再帰的であることを三つの変数を必要とするので、我々は唯一、[i]の値を[I-2]、DP [I-1]、DPをDP保存する必要があることを発見し、上記のプロセスをお読みください。
コード
public class problem91 {
/*
* 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 …… 'Z' -> 26
*
* 给定一个只包含数字的非空字符串,请计算解码方法的总数。
*
* 如12可解析为1、2或12
*
*/
public int numDecodings(String s) {
// 特判
if (s.length() == 0)
return 0;
if (s.charAt(0) == '0')
return 0;
if (s.length() == 1)
return 1;
//// 保存dp[n - 2], dp[n - 1], dp[n](dp[i]表示到第i个字符为止的解码方式)
int[] dp = { 0, 1, 1 };
for (int i = 1; i < s.length(); i++) {
dp[0] = dp[1];
dp[1] = dp[2];
if (s.charAt(i) == '0')
dp[2] = 0;
//判断第n-1和第n位是否会组成一个正确的编码
int tmp = (s.charAt(i - 1) - '0') * 10 + s.charAt(i) - '0';
if (tmp > 9 && tmp < 27)
dp[2] = dp[2] + dp[0];
// 出现'00'时,提前返回,节约时间
else if (tmp == 0)
return 0;
}
return dp[2];
}
public static void main(String[] args) {
problem91 pro = new problem91();
System.out.println(pro.numDecodings("12"));
}
}