【剑指offer】46. 把数字翻译成字符串

题目描述

在这里插入图片描述

在这里插入图片描述

// 46. 把数字翻译成字符串


// 力扣
// 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,
// 1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可
// 能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同
// 的翻译方法。

题解

/// 动态规划 
// 力扣
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:35.2 MB, 在所有 Java 提交中击败了66.89%的用户
class Solution {
    public int translateNum(int num) {
		// num转为String类型用于遍历num中每个数字,记为s。
		// 之后所有操作都基于s。
		String s = Integer.toString(num);
		if (s == null || s.length() == 0)
			return 0;
		int len = s.length();  // 取s长度
		// dp数组,根据s[i-2]和s[i-1](实际没有s[i-2]和s[i-1])判断dp[i]
		// 比如dp[2]表示s中前两个元素的组合数
		int[] dp = new int[len + 1]; 
		dp[0] = 1;  // 初始化
		dp[1] = 1;
		for (int i = 2; i <= len; i++) {
			// 结合s[i-2]和s[i-1]的情况(记为temp),
			// 用dp[i-2] dp[i-1]来判断dp[i]
			String temp = s.substring(i - 2, i);
			// 如果temp中数字大于10,小于25,说明可以组合
			// dp[i]为dp[i - 2]和dp[i - 1]之和。
			if (temp.compareTo("10") >= 0 && temp.compareTo("25") <= 0)
				dp[i] = dp[i - 2] + dp[i - 1];
			else 
				dp[i] = dp[i - 1];  // 否则不能组合,无法新增组合数
		}
		return dp[len];  // 最后返回dp结果,后一状态取决于前一状态,尾
						 // 元素即为最终状态
    }
}


// 力扣
// 简略写法
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:34.9 MB, 在所有 Java 提交中击败了97.16%的用户
class Solution {
    public int translateNum(int num) {
		String s = Integer.toString(num);
		if (s == null || s.length() == 0)
			return 0;
		int len = s.length();
		int[] dp = new int[len + 1];
		dp[0] = 1;
		dp[1] = 1;
		for (int i = 2; i <= len; i++) {
			String temp = s.substring(i - 2, i);  
			dp[i] = temp.compareTo("10") >= 0 && temp.compareTo("25") <= 0 ? dp[i-2] + dp[i-1] : dp[i-1];
		}
		return dp[len];
    }
}

猜你喜欢

转载自blog.csdn.net/fisherish/article/details/113427414
今日推荐