题目:
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
思路:建一个队列,将字符放入,要放入的字符与在队列中的字符进行比较,如果没有重复就放入,如果有重复,就弹出队列中的字符后再放入,每次放入前都要记录队列的长度。直至字符串的字符全部放入。注意,弹出是要将重复字符弹出为止,而不是只弹出重复字符 。重复字符前的字符也要弹出。(当然顺序队列必须一个一个的弹出)如下简图:b进,而已经在队列中的a,b出
第一次写弄了一个递归,代码:
class Solution:
def zuidazichuan(self,s,long):
a=[]
for i in s:
if i not in a:
a.append(i)
else:
s=s[s.index(i)+1:]
return self.zuidazichuan(s,long)
if long < len(a):
long = len(a)
return long
def lengthOfLongestSubstring(self, s: str) -> int:
long=0
a=self.zuidazichuan(s,long)
return a
是对字符串s 进行切片,效果十分差。
第二次在第一次上简单更改:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
a = []
long=[]
if len(s)>0:
for i in s:
if i in a:
long.append(len(a))
a = a[a.index(i) + 1:]
a.append(i)
else:
a.append(i)
long.append(len(a))
else:
long.append(0)
return max(long)
我使用了列表+切片的操作替代了队列的功能
在运行时间上有了极大的提升。
空字符串以及字符串为空格的情况是容易被忽略的