Longest Substring Without Repeating Characters

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值