[Alg]-查找最长不重复子串

 

如何从一个字符串中查找最长的不重复子串呢?可以有多种实现方式,以下是几种方式的python实现。

队列方式

依次把字符串中每个字符放到队列中,当遇到重复时,把重复字符及其前面的字符全部从队列中移除。

def LongestSubStringQueue(strFull):
    subLen = 0
    subStr = []
    for s in strFull:
        try:
            i = subStr.index(s)
            subStr = subStr[i+1:]
            subStr.append(s)
        except ValueError:
            subStr.append(s)
            if subLen<len(subStr):
                subLen = len(subStr)

    return subLen

因index会抛出异常且使用了额外的存储空间,此方式时间与空间效率都不高。

字符查找

使用find依次查找每个字符是否出现在前面的子串中。

def LongestSubStringFind(strFull:str)->int:
    if not strFull:
        return 0

    subLen = 1
    start = 0
    i = -1
    for cur in range(1, len(strFull)):
        i = strFull.find(strFull[cur], start, cur)
        if i == -1:
            count = cur-start+1
            if count>subLen:
                subLen = count
        else: #found
            start = i+1

    return subLen

此方式不需要额外的内存,空间效率最高;

字典方式

因字符数量有限,使用字典记录下每个字符最后出现的位置,然后快速查找。

def LongestSubStringDict(strFull:str)->int:
    if not strFull:
        return 0

    subLen = 1
    start = 0
    chIndex = {}
    for i in range(0, len(strFull)):
        ch = strFull[i]
        if (ch in chIndex) and (chIndex[ch]>=start):
            start = chIndex[ch]+1
        else:
            subLen = max(subLen, i-start+1)

        chIndex[ch] = i # set the character's index

    return subLen
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值