美文网首页Leetcode
[leetcode]3.无重复字符的最长子串

[leetcode]3.无重复字符的最长子串

作者: LeeYunFeng | 来源:发表于2019-01-09 19:56 被阅读0次

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

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

    解题思路:

    1. 最初的思路是采用笨办法,也就是暴力的列出所有子串,判断各个子串是否满足“不含重复字符”的条件,如果满足则记录字符串长度。从最长的子串开始搜索,一旦出现满足条件的子串,就返回结果。
      采用以上方法的时间复杂度为O(n^3),最终在某些测试样例上运行超时。

    2. 借鉴其它的思路,可以只遍历一次字符串的各个字符,记录当前最长子串的长度,同时记录当前子串的起始位置,遍历完成后即可得最终结果。使用这种方法时,不仅要用到各个字符的value,还需要用到对应的index,充分用到所有相关信息。时间复杂度为O(n)。

    笨办法:

    class Solution(object):
        def lengthOfLongestSubstring(self, s):
            """
            :type s: str
            :rtype: int
            """
            n=len(s)
            if n==0:
                return 0
            for l in range(n,0,-1):
                for i in range(0,n-l+1,1):
                    d={}
                    for j in s[i:i+l]:
                        if d.get(j):
                            d[j]+=1
                        else:
                            d[j]=1
                    if max(d.values())==1:
                        return l
    

    更快速的方法:

    class Solution(object):
        def lengthOfLongestSubstring(self, s):
            """
            :type s: str
            :rtype: int
            """
            start=0#当前子串的起始位置
            lmax=0#当前最大的子串长度
            d={}#用于记录value和index之间的映射
            for i,v in enumerate(s):
                # v in d表示此前出现过相同的字符,需要重新指定start
                if v in d:
                    start=max(d[v]+1,start)
                # 记录当前各个字符对应的最大index
                d[v]=i
                # 得到当前最大的子串长度
                lmax=max(lmax,i-start+1)
            return lmax
    

    相关文章

      网友评论

        本文标题:[leetcode]3.无重复字符的最长子串

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