通过滑动窗口算法实现
思路和算法
读取字符串通过标志位从左右到右逐个标记,当遇见重复时,保留标记位并记录当前子串值,进入下一轮循环,当字符串的字符都遍历了,就退出所有的循环。如下图所示,flag为滑动标记位变量
当flag+1==字符串长度时,让其推出外层循环
一、获取最长子串的长度值:
def getChildString(s):
result = set()
tmp = ""
length = len(s)
flag, maxLen = 0, 0
for i in range(length):
if i != 0 and flag + 1 < length:
a = tmp.index(s[flag])
tmp = tmp[a + 1::]
while (flag + 1 <= length) and (s[flag] not in tmp):
tmp += s[flag]
flag += 1
maxLen = max(maxLen, len(tmp))
# 当滑动到最后一个重复时,让其退出循环
if flag + 1 == length:
break
return maxLen
二、获取最长子串的值
通过对集合的字符串长度进行从大到小排序来获取最长子串的值。
def getChildStringValue(s):
result = set()
tmp = ""
length = len(s)
flag = 0
if length == 0 or length == 1:
return s
for i in range(length):
if i != 0 and flag + 1 < length:
a = tmp.index(s[flag])
tmp = tmp[a + 1::]
while (flag + 1 <= length) and (s[flag] not in tmp):
tmp += s[flag]
flag += 1
result.add(tmp)
# 当最后字符重复时,让其退出循环
if flag + 1 == length:
break
# 获取第一个最长子串的值
childstring = sorted(result, key=lambda k: len(k), reverse=True)[0]
return childstring
通过对集合的按长度倒序排序取,获取第一个长度最长的子串。这里对原字符串为0或1的特殊情况做了预先处理,要不然sorted(result, key=lambda k: len(k), reverse=True)[0]会报错