[剑指 Offer 48. 最长不含重复字符的子字符串] | 刷题打卡

170 阅读1分钟

今天我们来做一道LeetCode上的题目,原题链接:剑指 Offer 48. 最长不含重复字符的子字符串

题目描述

  • 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
  • 示例 1:
  输入: "abcabcbb"
  输出: 3 
  解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3
  • 示例 2:
  输入: "bbbbb"
  输出: 1
  解释: 因为无重复字符的最长子串是 "b",所以其长度为 1
  • 示例 3:
  输入: "pwwkew"
  输出: 3
  解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
  请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
  • 提示:
  s.length <= 40000

思路分析

  • 边界判断:s为空是返回0
  • 动态规划 + Hash表
  • 哈希表统计:遍历字符串s时,使用哈希表s_dict统计各字符最后一次出现的索引位置
  • 转移方程:dp[j - 1] -> dp[j]
  • 注:s_dict.get(s[j], -1):代表当哈希表包含键key时返回对应value,不包含时返回默认值default

代码

# Python
class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        # 动态规划 + Hash表
        if not s: return 0
        s_dict = {}
        res, temp = 0, 0
        for j in range(len(s)):
            i = s_dict.get(s[j], -1)                    # 获取哈希索引
            s_dict[s[j]] = j                            # 刷新哈希表
            temp = temp + 1 if j - i > temp else j - i  # dp[j - 1] -> dp[j]
            res = max(res, temp)                        # max(dp[j - 1], dp[j])
        return res

总结

  • 后续尝试滑动窗口通用方案

附录

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情