Leetcode——3.无重复字符的最长子串

蛮力法

思路:从第一个字符开始找最大的子串,接着从第二个字符开始找最大的子串…以此类推,把每次找到的子串数放在一个空的数组,最后返回数组的最大数。
缺点:简单粗暴,超出时间限制
代码如下:

class Solution:
       def lengthOfLongestSubstring(self,arr):
             if arr is None or len(arr) == 0:             #空字符的情况
                return 0;
             count_list = [1]            #max(count_list)如果count_list是空的就报错,所以放了个1
             for i in range(len(arr)):
                  temp = []
                  count = 1
                  for j in range(i+1,len(arr)):
                       temp.append(arr[i])
                       if arr[j] not in temp:
                            temp.append(arr[j])
                            count += 1
                       else:
                             break              #这一步体现了子串,而不是子序列
                       count_list.append(count)
               return max(count_list)

无奈到字符串超长,这个算法的复杂度太高了,目测是O(n^2),我这菜鸟水平只能写出这个爆炸的算法。

哈希查找

当然是参考了一堆大神的解法,说是要借助哈希查找key的O(n)的时间复杂度,不然你就不过,吓得我赶紧恶补了一下哈希查找。

class Solution:
    def lengthOfLongestSubstring(self,s):
        ans = 0
        #left用于记录合法的左边界位置,last用于记录字符上一次出现的位置
        left = 0
        last = {}
        for i in range(len(s)):
            #子串中出现重复字符,变更left至上一次s[i]出现位置之后,使得子串合法
            if s[i] in last and last[s[i]] >= left:
                left = last[s[i]] + 1
            last[s[i]] = i
            ans = max(ans,i-left+1)
        return ans

不懂什么意思,明天再来理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值