Leetcode剑指Offer刷题指南:
解法:动归
初始化:
(nums[0] == 2 && nums[1] <= 5) || nums[0] == 1 --> dp[1] = 2 else --> dp[1] = dp[0]
递推关系:
(nums[i - 1] == 2 && nums[i] <= 5) || nums[i - 1] == 1 --> dp[i] = dp[i - 1] + dp[i- 2]
else --> dp[i] = dp[i - 1]
返回结果:
dp[len - 1]
易理解初始版:
class Solution {
public int translateNum(int num) {
int[] nums = help(num);
int len = nums.length;
if (len <= 1) return 1;
int[] dp = new int[len];
//初始化
dp[0] = 1;
dp[1] = ((nums[0] == 2 && nums[1] <= 5) || nums[0] == 1) ? 2 : dp[0];
//递推
for (int i = 2; i < len; ++i) {
dp[i] = ((nums[i - 1] == 2 && nums[i] <= 5) || nums[i - 1] == 1) ? dp[i - 1] + dp[i - 2] : dp[i - 1];
}
return dp[len - 1];
}
private int[] help(int num) {
//将整数转化为数组
int len = Integer.toString(num).length();
int[] ret = new int[len];
for (int i = len - 1; i >= 0; --i) {
ret[i] = num % 10;
num /= 10;
}
return ret;
}
}
优化版:
此时我们可以将整数转化为数组和目标函数进行合并处理
class Solution {
public int translateNum(int num) {
String str = String.valueOf(num);
int[] dp = new int[str.length() + 1];
dp[0] = dp[1] = 1;
for (int i = 2; i <= str.length(); ++i) {
String tmp = str.substring(i - 2, i);
//tmp必须在10-25之间,举例:不能为06和28
dp[i] = (tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0) ? dp[i - 2] + dp[i - 1] : dp[i - 1];
}
return dp[dp.length - 1];
}
}
解法一:动归 + hashmap
递推关系:dp[j - 1] < j - i --> dp[j] = dp[j - 1] + 1 (字符不重复)
else --> dp[j] = j - i (字符重复) dp[j] = Math.min(dp[j - 1] + 1, j - i)
返回结果:Math.max(ret, tmp)
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
int ret = 0, tmp = 0;
for (int j = 0; j < s.length(); ++j) {
// 获取索引 i
int i = map.getOrDefault(s.charAt(j), -1);
// 更新哈希表
map.put(s.charAt(j), j);
tmp = Math.min(j - i, tmp + 1);
ret = Math.max(ret, tmp);
}
return ret;
}
}
解法二:滑动窗口 - 双指针
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> dic = new HashMap<>();
int i = -1, ret = 0;
for (int j = 0; j < s.length(); j++) {
if (dic.containsKey(s.charAt(j)))
// 更新左指针 i
{
i = Math.max(i, dic.get(s.charAt(j)));
}
dic.put(s.charAt(j), j);
ret = Math.max(ret, j - i);
}
return ret;
}
}