题目描述
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路
本题中,设以第i个字符s[i]结尾的最长不重复字串的长度为res[i], 左边距离最近的相同字符在位置j, 为s[j] , 即s[j]=s[i]
则有
- 如果res[i-1] < i-j, 即虽然有重复字符,但重复字符在当前最长的字符串区间之外,因此res[i] = res[i-1] + 1;
- 如果res[i-1[ >= i-j, 即字符s[j]正好在当前的最长字符串之间,因此dp[i] = i-j;
边界条件和初始条件为
res[0] = 1;
最后返回res中的最大值即可。
其中,字符出现的索引位置通过哈希表进行记录。
代码
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
dic = {} # 哈希表,记录字符出现的索引位置
res = 0 # 返回值
temp = 0
for i in range(len(s)):
j = dic.get(s[i], -1)
dic[s[i]] = i # 更新哈希表
if temp < i - j:
temp = temp + 1
else:
temp = i - j
res = max(res, temp)
return res