给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
左指针依次遍历字符串中的每一个字符,右指针从左指针的位置开始,依次把字符放入哈希集合中。当下一个字符与哈希集合中的字符重复时,停止移动右指针,将此时的子串长度记录下来。并且把左指针向右移动一位,把左指针刚刚所指字符从哈希集合中删除,右指针再重复上面的操作,更新最长子串的长度。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
occ = set()
rk , ans = -1 , 0
for i in range(len(s)):
if i != 0:
occ.remove(s[i-1])
while((rk+1) < len(s)) and s[rk+1] not in occ:
occ.add(s[rk+1])
rk +=1
ans = max(ans,rk-i+1)
return ans
用时80ms,15MB
注:
判断重复字符
在上面的流程中,我们还需要使用一种数据结构来判断 是否有重复的字符,常用的数据结构为哈希集合(即 C++ 中的 std::unordered_set,Java 中的 HashSet,Python 中的 set, JavaScript 中的 Set)。在左指针向右移动的时候,我们从哈希集合中移除一个字符,在右指针向右移动的时候,我们往哈希集合中添加一个字符。