给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
先来看代码:
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
if s=="":
return 0
l1=[]
s1=s2=0
for i in s:
if i in l1:
o=l1.index(i)
l1=l1[o+1:]
s2=len(l1)
l1.append(i)
s2=len(l1)
if s2>s1:
s1=s2
return s1
这个题的思路就是:我们会发现我们可以先创建一个列表,然后遍历字符串,将字符一个一个加入到列表中,并不断记录列表长度,总是保留最大值,当出现重复字符的时候,将与其重复的字符及其之前的字符删去,继续进行下去,最后就能找出最长子串。
看了一些其他方法,都是大同小异,有一种是用字典:
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
st = {}
i, ans = 0, 0
for j in range(len(s)):
if s[j] in st:
i = max(st[s[j]], i)
ans = max(ans, j - i + 1)
st[s[j]] = j + 1
return ans;
这个里面也用到了一个内置函数,看起来确实比我的简洁,他的大致思路就是用 i 不断记录重复字符的位置,用ans记录最大长度,同时依靠字典的查找能力。
还有用函数的方法:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if s == '':
return 0
if len(s) == 1:
return 1
def find_left(s, i):
tmp_str = s[i]
j = i - 1
while j >= 0 and s[j] not in tmp_str:
tmp_str += s[j]
j -= 1
return len(tmp_str)
length = 0
for i in range(0, len(s)):
length = max(length, find_left(s, i))
return length
创建一个函数来起到倒序增加长度并不断记录长度的作用。这样的思路也是比较好的。