如何從一個字符串中查找最長的不重複子串呢?可以有多種實現方式,以下是幾種方式的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