Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、前言
刷题啊!!!
开始刷 “剑指 Offer” 31天。刷完时间:2022.3.6 ~ 2022.3.20。
二、题目
题意:
- 把数字翻译成字符串
(1)剑指 Offer 46. 把数字翻译成字符串
题目描述
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
提示:0 <= num < 231
题解
注意:用
dp
思维哦!!!
此题理解起来:可以取 1位 表示字母,可以取 2位 表示字母。
动态转移方程:总次数 = 取1位的次数 + 取2位的次数
- 当后两位在
[10,25]
区间:dp[i] = dp[i / 10] + dp[i / 100]
- 当后两位在
[0, 9]
区间:dp[i] = dp[num / 10]
初始状态:dp[0] = dp[1] = 1
, 即 “无数字” 和 “第 1 位数字” 次数为 1。
AC
代码如下:
class Solution {
public static int translateNum(int num) {
if (num == 0) return 1;
if (num < 10) return 1;
if (num <= 25) return 2;
if (num < 100) return 1;
int two = num % 100;
if (two <= 25 && two >= 10) return translateNum(num / 10) + translateNum(num / 100);
return translateNum(num / 10);
}
}
(2)剑指 Offer 48. 最长不含重复字符的子字符串
题目描述
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
题解
利用辅助数组来记录字母是否存在,其下标记录为字母下标。
思路如下:
-
指针
pre
:从 0 开始,冲突则向前 -
判断当前字母是否存在:
- 存在:
- 不存在:更新下标,计算长度
-
比较:取与不取最大值
状态转移方程:dp[i] = max(dp[i - 1], dp[i])
AC
代码如下:
class Solution {
public int lengthOfLongestSubstring(String s) {
if (null == s || s.length() == 0) return 0;
Map<Character, Integer> map = new HashMap<>(s.length());
int ans = 0, cur = 0;
for (int i = 0; i < s.length(); ++i) {
if (!map.containsKey(s.charAt(i))) {
cur += 1;
} else {
cur = cur < i - map.get(s.charAt(i)) ? cur + 1 : i - map.get(s.charAt(i));
}
map.put(s.charAt(i), i);
ans = Math.max(ans, cur);
}
return ans;
}
}