您的位置:首页 > 其它

Longest Substring Without Repeating Characters

2016-07-19 11:06 302 查看
leetcode第三题,要求寻找一个最长不重复连续子串。

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

size = len(s)
maxlen = 0

for i in range(size):
counter = 1
j = 0
visit = {}
visit[s[i]] = 1
for j in range(i+1,size):
if s[j] not in  visit:
counter += 1
else:
if counter > maxlen:
maxlen = counter
break
if 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: