来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
1 class Solution: 2 def lengthOfLongestSubstring(self, s: str) -> int: 3 # 哈希集合,记录每个字符是否出现过 4 occ = set() 5 n = len(s) 6 # 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动 7 rk, ans = -1, 0 8 for i in range(n): 9 if i != 0: 10 # 左指针向右移动一格,移除一个字符 11 occ.remove(s[i - 1]) 12 while rk + 1 < n and s[rk + 1] not in occ: 13 # 不断地移动右指针 14 occ.add(s[rk + 1]) 15 rk += 1 16 # 第 i 到 rk 个字符是一个极长的无重复字符子串 17 ans = max(ans, rk - i + 1) 18 return ans 19 20 作者:LeetCode-Solution 21 链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/wu-zhong-fu-zi-fu-de-zui-chang-zi-chuan-by-leetc-2/ 22 来源:力扣(LeetCode)
哈希Map,仅需一次遍历:
1 class Solution: 2 def lengthOfLongestSubstring(self, s: str) -> int: 3 k, res, c_dict = -1, 0, {} 4 for i, c in enumerate(s): 5 if c in c_dict and c_dict[c] > k: # 字符c在字典中 且 上次出现的下标大于当前长度的起始下标 6 k = c_dict[c] 7 c_dict[c] = i 8 else: 9 c_dict[c] = i 10 res = max(res, i-k) 11 return res