leetcode无重复字符的最长子串python

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
先来看代码:

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        if s=="":
            return 0
        l1=[]
        s1=s2=0
        for i in s:
            if i in l1:
                o=l1.index(i)
                l1=l1[o+1:]
                s2=len(l1)
            l1.append(i)
            s2=len(l1)
            if s2>s1:
                s1=s2
        return s1
            

这个题的思路就是:我们会发现我们可以先创建一个列表,然后遍历字符串,将字符一个一个加入到列表中,并不断记录列表长度,总是保留最大值,当出现重复字符的时候,将与其重复的字符及其之前的字符删去,继续进行下去,最后就能找出最长子串。

看了一些其他方法,都是大同小异,有一种是用字典:


class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        st = {}
        i, ans = 0, 0
        for j in range(len(s)):
            if s[j] in st:
                i = max(st[s[j]], i)
            ans = max(ans, j - i + 1)
            st[s[j]] = j + 1
        return ans;

这个里面也用到了一个内置函数,看起来确实比我的简洁,他的大致思路就是用 i 不断记录重复字符的位置,用ans记录最大长度,同时依靠字典的查找能力。

还有用函数的方法:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if s == '':
            return 0
        if len(s) == 1:
            return 1
            
        def find_left(s, i):
            tmp_str = s[i]
            j = i - 1
            while j >= 0 and s[j] not in tmp_str:
                tmp_str += s[j]
                j -= 1
            return len(tmp_str)
        length = 0
        for i in range(0, len(s)):
            length = max(length, find_left(s, i))
        return length

创建一个函数来起到倒序增加长度并不断记录长度的作用。这样的思路也是比较好的。

发布了29 篇原创文章 · 获赞 28 · 访问量 289

猜你喜欢

转载自blog.csdn.net/weixin_45398265/article/details/104910343
今日推荐