def get_longest_substr1(s):
"""
暴力破解
1.获取全部不重复子串
2.按长度,降序,取第一个
:param s:
:return:
"""
length = len(s)
non_repeats = [(len(s[x:y+1]), s[x:y+1]) for x in range(length) for y in range(x, length) if len(s[x:y+1]) == len(set(s[x:y+1]))]
return sorted(non_repeats, key=lambda item: item[0], reverse=True)[0]
def get_longest_substr2(s):
"""
暴力破解
1.遍历全部子串
2.记录当前不重复子串长度,与当前最大长度比较,取最大值
3.遍历完后返回最大值
:param s:
:return:
"""
length = len(s)
ans = 0
for x in range(length):
for y in range(x, length):
substr = s[x:y+1]
if len(substr) == len(set(substr)):
ans = max(ans, len(substr))
return ans
def get_longest_substr3(s):
"""
滑动窗口:
1.以0为起点,为左边界(start);元素索引记录在d字典中,向右遍历
2.如果右边界匹配到d字典值,即重复,此时记录当前长度,即当前索引减去当前起点(i-start)
3.左边界=重复元素索引+1, 重复的元素索引值记录为当前的i
4.遍历完成后,字串长度减去start,与当前记录的最大长度比较,取最大值
:param s:
:return:
"""
d = {}
ans = 0
start = 0
for i, x in enumerate(s):
if x in d:
ans = max(ans, i-start)
start = max(start, d[x] + 1)
d[x] = i
ans = max(ans, len(s)-start)
return ans
获取最长不重复子串
最新推荐文章于 2021-04-04 18:08:43 发布