动态规划 05

103 阅读1分钟

WvJCI1.png

原题链接

代码如下:

/**
 * 递归
 * 
 * 由题,两位数到25之间有两种情况 
 * 即:两位整体翻译 或 两位分别翻译 [10,25]这个区间需要判断,
 * 其他范围的只有一种情况
 * 题目说'a'是0,所以'z'是25
 *
 * Code by java
 */

class Solution {
	public int translateNum(int num) {
		if (num <= 9)
			return 1;

		int rear = num % 100;
		if (rear <= 9 || rear >= 26) {
			return translateNum(num / 10);
		} else {
			return translateNum(num / 10) + translateNum(num / 100);
		}
	}

	public static void main(String[] args) {
		Solution a = new Solution();
		int num = 12258;
		System.out.println(a.translateNum(num));
	}
}

/**
 * 动态规划
 * 
 * dp的值代表前面能构成的总翻译数 定义dp[0] = 1,相当于刚开始什么都不做,为了给第一位赋值 dp[1] = 1,即赋dp[0]的值
 * 
 * Code by java
 */

class Solution {
	public int translateNum(int num) {
		String s = Integer.toString(num);
		int len = s.length();
		int[] dp = new int[len + 1];
		dp[0] = 1; // 刚开始什么都不做,定义为1,方便数组第一个开始操作
		dp[1] = 1; // 相当于直接赋值dp[0]
		for (int i = 2; i < len + 1; i++) {
			int temp = (s.charAt(i - 2) - '0') * 10 + s.charAt(i - 1) - '0';// 注:chatAt返回的是char类型,需要减去'0'才是真实值
			if (temp >= 10 && temp <= 25) {
				dp[i] = dp[i - 1] + dp[i - 2];
			} else {
				dp[i] = dp[i - 1];
			}
			/*
			 * String temp = s.substring(i-2, i); 	//截取子字符串
			 * if(temp.compareTo("10") >= 0 && temp.compareTo("25") <= 0) 
			 * 		dp[i] = dp[i-1] + dp[i-2];
			 * else 
			 *  	dp[i] = dp[i-1];
			 */
		}
		return dp[len];
	}

	public static void main(String[] args) {
		Solution a = new Solution();
		int num = 12258;
		System.out.println(a.translateNum(num));
	}
}