[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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章