codetop1:无重复字符的最长字串
无重复字符的最长字串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路
给定一个串,使用while循环进行遍历,终止条件是while的查询索引找到最后一个字符。使用python中的in来判断字符是否在给定的串中。如果不在就添加到临时串中,如果在的话直接退出。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
#初始化串和初始索引
maxAllLen=0
for i in range(len(s)):
temp=s[i]
maxLen=1
for j in range(i+1,len(s)):
if s[j] not in temp:
temp=temp+s[j]
maxLen+=1
else:
break
if maxAllLen<maxLen:
maxAllLen=maxLen
return maxAllLen
笨方法加1
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s or len(s)==1:
return len(s)
left,right=0,1
begin,end=0,1
while right<len(s):
if len(set(s[left:right+1]))!=len(s[left:right+1]): #说明遇到了一样的
print("hhhh")
if right-left>end-begin:
begin=left
end=right
#处理left
while s[left]!=s[right]:
left+=1
left+=1
print(f"{left}:{right}")
right+=1
if right+1-left>end-begin:
return len(s[left:])
else:
return len(s[begin:end])
思路
来源于题解,使用的是滑动窗口的思路,如果移入了冲突的元素,就从头部位置将元素移除。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
#定义初始滑动窗口
maxLen=0
curLen=0
left=0
deque=set()
for i in range(len(s)):
#清除冲突元素
while s[i] in deque:
deque.remove(s[left])
left+=1
curLen-=1
curLen+=1
deque.add(s[i])
if curLen>maxLen:
maxLen=curLen
return maxLen
滑动窗口的精髓就在于他有一个while的内部循环。
思路
最新写的代码,好像比第一次写的更好看一点
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
left,right=0,1
begin,end=0,1
while right<len(s):
if s[right] in s[left:right]:
while s[left]!=s[right]:
left+=1
left+=1
else:
right+=1
if right-left>end-begin:
end=right
begin=left
if end-begin>right-left:
return len(s[begin:end])
else:
return len(s[left:])