今天我们来做一道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 春招闯关活动」, 点击查看 活动详情