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