91復号化方法タイトルleetcode

タイトル

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"));

	}
}
发布了36 篇原创文章 · 获赞 0 · 访问量 489

おすすめ

転載: blog.csdn.net/qq_36360463/article/details/104255100