题3:类型:哈希表、双指针、字符串
- 题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
例 1:
输入: "abcabcbb"
输出: 3
解释: 因无重复字符的最长子串是 "abc",所以其长度为 3。
例 2:
输入: "bbbbb"
输出: 1
解释: 因无重复字符的最长子串是 "b",所以其长度为 1。
例 3:
输入: "pwwkew"
输出: 3
解释: 因无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
- 本题依旧是用keys保存字符串的值,values保存字符串下标。满足条件的前后指针下标之差即为所求长度。
- star做前指针,i做后指针遍历字符串,在字典d中记录值与下标。若i指向的值在d中未出现,则更新最大长度。若重复字符连续出现则将starl移动到上次出现的坐标的下一位(迭代后应是重复字符段的最后一位)。若重复字符非连续出现需要注意,最长子串可能在其中,不要移动前指针,先更新最大长度同时该重复字符在字典中的值被更新(字符串中的下标)。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
d = {}
max_len = 0
star = 0
for i in range(len(s)):
#重复字符是否连续出现,例如‘abbcdaf’中第二个a
if s[i] in d.keys() and d[s[i]]>= star:
star = d[s[i]] + 1
else:
max_len = max(max_len,i-star+1)#+1是因为i与star初始是0
#字典保存需在后,若在前第一轮就结束结果为0,重复字符在字典中的值不断更新
d[s[i]] = i
return max_len