【力扣】无重复字符的最长字串

来源:力扣(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

 

上一篇:003——无重复字符的最长子串


下一篇:势能函数和鞅的停时定理