【剑指 Offer】第 10 天

56 阅读2分钟

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;
    }
}