当前位置 博文首页 > 已经大二了,继续努力的博客:leetcode无重复字符的最长子串pyth

    已经大二了,继续努力的博客:leetcode无重复字符的最长子串pyth

    作者:[db:作者] 时间:2021-09-17 18:15

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
    示例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

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

    cs