如何从一个字符串中查找最长的不重复子串呢?可以有多种实现方式,以下是几种方式的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