leetcode-python-03无重复字符的最长子串
Posted Python_Heaven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode-python-03无重复字符的最长子串相关的知识,希望对你有一定的参考价值。
题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
解法1:
暴力解法:
定义一个字典,循环了2次,外层循环从第一个开始,取出字符str1=s[i]
内层循环取出相邻的字符,不同的拼接,已有就跳出内层循环,
将当前的字符串保留在字典中。
字典值进行排序取出最大值。
def max_string(s):
if len(s) == 0:
return 0
dic =
for i in range(len(s)): # a ,b
str1 = s[i]
for j in range(i + 1, len(s)):
if s[j] not in str1:
str1 = str1 + s[j]
else:
break
dic[str1] = len(str1)
result = max(dic.values())
return result
解法二:
初始定义左边值,右边值,列表,最大长度:
left=0
right=1
list1 = []
max_lenght=0
然后开始遍历:
right往右走
[a]
[a,b]
[a,b,c]
当碰到第四个值是a时,记录下最大长度max_lenght=len(llist1),
清空list1.
然后将left+=1,right=left+1
right 往右走,放在列表中,当碰到元素在列表中,就停止
def max_string1(s):
len_s = len(s)
right = 0
list1 = []
max_lenght = 0
for i in range(len_s):
while (right < len_s) and (s[right] not in list1):
list1.append(s[right])
right = right + 1
cur_len = len(list1)
if cur_len > max_lenght:
max_lenght = cur_len
list1 = []
right = i + 1
return max_lenght
解法三:
这个是额外使用一个列表,
初始化使:左边等于0,右边等于左边加一,列表先放入第一个值
在while循环中,如果右边的值不在列表中,就加在列表中,继续右边往后走,
每次计算更新最大长度值,否则左边+1,
右边等于左边加一,列表先放入第一个值循环。
def max_string2(s):
len_s = len(s)
if len_s == 0:
return 0
left = 0
right = left + 1
list1 = [s[left]]
max_lenght = len(list1)
while right < len_s:
if s[right] not in list1:
list1.append(s[right])
right = right + 1
cur_len = len(list1)
if cur_len > max_lenght:
max_lenght = cur_len
else:
left += 1
list1 = [s[left]]
right = left + 1
return max_lenght
解法四:
使用列表,遍历字符串,当碰到的值在列表中,就while一直pop出第一个,可以去掉重复值,
不在的加在列表之后,每次计算更新最大值。
def max_string4(s):
str1 = []
max_lenght = 0
for i in s:
while i in str1:
str1.pop(0)
str1.append(i)
max_lenght = max(len(str1), max_lenght)
return max_lenght
以上是关于leetcode-python-03无重复字符的最长子串的主要内容,如果未能解决你的问题,请参考以下文章