美文网首页
无重复字符的最长子串

无重复字符的最长子串

作者: hustyanye | 来源:发表于2019-07-13 10:02 被阅读0次

    https://leetcode-cn.com/explore/interview/card/bytedance/242/string/1012/

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

    示例 1:

    输入: "abcabcbb"
    输出: 3
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    示例 2:

    输入: "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
    示例 3:

    输入: "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
    请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

    思路:
    遍历一次字符串,不停更新最大长度即可。在实现中用start变量记录从哪里开始记录不重复字符串的首位置。用str_dict记录每个字符出现的位置

    遍历过程中,分为2种情况:

    1. 遍历到的字符串没有重复,或者字符串重复的位置比start小(当做没有重复处理),此时记录/更新 str_dict,如果超过最大长度,更新最大长度
    2. 遍历的字符已存在且位置比start大,此时先更新最大长度(注意不要+1),在更新start位置和str_dict。
    class Solution(object):
        def lengthOfLongestSubstring(self, s):
            """
            :type s: str
            :rtype: int
            """
            if not s:
                return 0
            start = 0 
            longest = 0
            str_dict = {}
            
            for i in range(0,len(s)):
                if s[i] not in str_dict or str_dict[s[i]]<start:
                    str_dict[s[i]] = i
                    if i - start + 1 > longest:
                        longest = i - start +1
                else:
                    if i - start  > longest:
                        longest = i - start 
                    start = str_dict[s[i]] + 1
                    str_dict[s[i]] = i
                
            return longest
    

    相关文章

      网友评论

          本文标题:无重复字符的最长子串

          本文链接:https://www.haomeiwen.com/subject/bqdpkctx.html