力扣-无重复字符的最长子串

无重复字符的最长子串

题目描述

题目链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

难度:中等

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

解析

由于题目要求最长子串,其可以在原串中表示为一个区间,也就是说,我们要在原字符串中找到一个最大的区间,这个区间内无重复字符。这就很容易能想到滑动窗口。

下面来说一下算法思想:我们维护两个整数,一个是区间起点,用start表示;一个是区间终点,用end表示,首先在固定start的同时尽可能让end后移,每次后移时判断一下新加入的字符是否已经存在,这个可以用集合set轻松实现,我偷懒用的字典。如果新加入的字符已经在原区间内,则移动start,一直移动到没有重复字符为止。每次移动后都去更新一下ans,把最大的留下来

代码

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        visit = {}  # 记录区间内已经存在的字符
        start, end = 0, 0  # 区间端点
        ans = 0  # 记录答案
        str_len = len(s)

        while end < str_len:
            if not visit.get(s[end], False):  # 当前要加入的字符不会导致重复
                visit[s[end]] = True
                end += 1
            else:  # 当前加入的字符会导致重复
                while s[start] != s[end]:
                    visit[s[start]] = False
                    start += 1

                visit[s[start]] = False
                start += 1
            
            ans = max(ans, end - start)  # 更新答案

        return ans

总结

本题难度相比于前面两道简单题确实多了一些需要思维的过程,但是也是很简单的那种了。

posted @ 2022-01-19 16:19  XBCoder  阅读(24)  评论(0)    收藏  举报