Given a string, find the length of the longest substring without repeating characters.
给定一个字符串,找到最长子字符串的长度而不重复字符。
一.穷举循环法
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
max1=1
n=0
if s=="":
max1=0
return max1
else:
for i in s:
n=n+1
t=1
p=n
for j in s[n:]:
if j in s[n-1:p]:
max1 = max(t, max1)
break
else:
t=t+1
max1=max(t,max1)
p=p+1
return max1
两次循环
外循环:遍历字符串中每一个字符
内循环:遍历外循环字符串字符之后的每一个字符串,一旦发现和外循环字符重复,就退出内循环
每次内循环更新最长字串的值
二.滑动窗口法
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
n=len(s)
if s=="":
return 0
if n==1:
return 1
else:
i=0
j=1
max1=1
while (i<n and j<n):
if s[j] in s[i:j]:
i=i+1
j=i+1
else:
j=j+1
max1=max(max1,(j-i))
return max1
solution中给出了一种滑动窗口概念,在java中运用。
在窗口中存储当前数据:[i,j)j一开始等于i。
当j索引不在窗口里,窗口末端向后滑,并返回j-i
当j索引在窗口里,窗口前端向后滑
保证遍历每一个字符
运用到python中
和第一种方法的想法是完全一样的,但是算法不同,时间复杂度节省了很多
遍历每一个字符和子字符串 可以用滑动窗口的想法来遍历,而不需要用两个for循环
三.还有一种更简便的方法
看不懂了。。。。