找到字符串的最长无重复字符子串

题目:

  给定一个字符串str,返回str中最长无重复字符子串的长度。

举例:

  str = “abcd”,返回4。 
  str = “aabcb”,返回3。

基本思路:

  如果str的长度为N,字符的编码范围为M,本题可以做到时间复杂度为O(N),空间复杂度O(M)。具体方法如下:

在遍历str之前,先申请几个变量。哈希表map,key表示某个字符,value为这个字符最近出现的位置。整型变量pre,如果当前遍历到的字符为str[i],pre表示必须以str[i-1]结尾的情况下,最长无重复字符子串开始位置的前一个位置,初始时pre = -1。全局变量length保存出现的最长长度。从左到右依次遍历str,遍历到str[i]时,计算必须以str[i]结尾的最长无重复字符子串的长度。

map[str[i]]表示之前出现str[i]字符的位置,假设该位置是a。以str[i]结尾的无重复子串必然不包括a位置。

根据pre的定义可知,在以str[i-1]为结尾的情况下,最长无重复子串的长度为(i-1)- pre,此时如果a的位置在pre的右边,则以str[i]结尾的最长子串的长度为 i - a;如果a的位置在pre的左边,则以str[i]结尾的最长子串的长度为i - pre。这个问题画个图就很直观了,这里不多解释。

计算完长度以后,pre位置和a位置哪一个在右边就作为新的pre的值。然后去计算下一个位置的字符,整个过程用length保存出现的最大值。

def maxLengthStr(str1):

    if str1 == None or str1 == '':
        return 0

    map_ = {}
    pre = -1

    for i in range(len(str1)):
        if str1[i] in map_:
            pre = max(pre,map_[str1[i]])

        length = max(length,i-pre)
        map_[str1[i]] = i

    return length


maxLengthStr("abcd")
maxLengthStr("aabcb")

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值