Leetcode - 3 无重复字符的最长子串 python

版权声明:本文章为原创,未经许可不得转载 https://blog.csdn.net/weixin_41864878/article/details/90444772

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

示例 1:

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

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

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

1 滑窗

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        if not s: return 0
        
        d = {} #用来记录每个字符出现的下标,重复就替换
        maxlength = 0
        left_idx = 0#窗口起点
        for i in range(len(s)):
            if s[i] in d and left_idx <= d[s[i]]:#出现重复并且窗口起始点小于s[i]上一次出现的坐标就修改窗口的起点
                left_idx = d[s[i]] + 1
            maxlength = max(maxlength, i - left_idx + 1)
            d[s[i]] = i
        return maxlength

结果不尽人意,因为生成字典占内存,这样查找也会费时
在这里插入图片描述

用index查找

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        if not s: return 0
        maxlength = 0
        sub = ''
        for i in range(len(s)):
            if s[i] not in sub:
                sub += s[i]
            else:
                idx = sub.index(s[i])
                sub = sub[idx+1:] + s[i]
            maxlength = max(maxlength, len(sub))
        return maxlength

快了非常多,事实证明python自带的函数就是比较好用LOL…
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41864878/article/details/90444772