Longest Substring Without Repeating Characters

来源:互联网 发布:淘宝折扣app哪个好 编辑:程序博客网 时间:2024/06/15 08:10

leetcode第三题,要求寻找一个最长不重复连续子串。

最最简单的想法就是双重循环进行遍历,为了提高效率,可以在第二层循环中做文章,可以使用模拟hash来记录使用过的字符,也可以使用python内置的in方法,还可以使用字典来记录,不过这些方法都有一个问题,那就是复杂度都是o(n2),测试数据中有一个很长的字符串,时间不能满足要求。

size = len(s)maxlen = 0for i in range(size):counter = 1j = 0visit = {}visit[s[i]] = 1for j in range(i+1,size):if s[j] not in  visit:counter += 1else:if counter > maxlen:maxlen = counterbreakif j == size-1 and counter>maxlen:maxlen = counter

有没有一种方法可以一遍循环就解决问题呢?分析一下,双重循环是因为需要寻找以每一个字符为开头的子串,这些子串都有可能成为最长不重复连续子串,在寻找过程中,如果碰到重复字母,则这个子串内无论是从哪一个位置开始都不会最大不重复长度都不会超过从start开始的长度,此时立刻终止该子串的查询,记录一下长度是不是最长的,而后接着搜索以下一个字符开头的子串。

class Solution(object):    def lengthOfLongestSubstring(self, s):        """        :type s: str        :rtype: int        """        start = 0        maxlen = 0                charused = {}        size = len(s)        for i in range(size):        if s[i] in charused and start <= charused[s[i]]:        start = charused[s[i]]+1        else:        maxlen = max(maxlen,i-start+1)        charused[s[i]] = i        return maxlen


0 0
原创粉丝点击