力扣-- 无重复字符的最长子串
1. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
2.解题思路
思路1:
将所有的可能性列出来,判断是否是重复的,思路正确,但是超时了。
class Solution:
# 思路对超时
def cf(self,s):
t={}
for i in range(len(s)):
if s[i] not in t:
t[s[i]]=1
else:
return True
return False
def lengthOfLongestSubstring(self, s: str) -> int:
l=len(s)
if l==0:
return 0
mlen=1
for i in range(l):
for j in range(i,l):
if not self.cf(s[i:j+1]):
if mlen<len(s[i:j+1]):
mlen=len(s[i:j+1])
return mlen
思路2:
将不重复的字符放入数组中, 并且记录一个最大的长度值,数组中重复,就把原数组变成从它后一个位置开始的数组。例如:
s=“abac” 第一轮,curr=[“a”] currlen=1,maxlen=1,第二轮,curr=[“a”,“b”],currlen=2,maxlen=2,第三轮,index=0,curr=[1:]=[“B”]
cur=[“b”,“a”],第四轮,curr=[“b”,“a”,“c”],maxlen=3,就完成了。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
curr = []
maxlen = 0
for c in s:
if c in curr:
index = curr.index(c)
curr = curr[index + 1:]
curr.append(c)
else:
curr.append(c)
currlen = len(curr)
if currlen > maxlen:
maxlen = currlen
return maxlen