给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
自己解答
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
maxlen=0
for j in range(len(s)):
ss=s[j:len(s)]
# print('ss : ',ss)
for i in range(len(ss)):
# print(ss[0:i+1])
str_=ss[0:i+1]
dic1={}
for str1 in str_:
dic1[str1]=str1
if len(dic1.keys())==len(str_):
thislen=len(str_)
if thislen>maxlen:
maxlen=thislen
else :
break
return maxlen
执行用时:7612 ms, 在所有 Python3 提交中击败了5.01% 的用户
内存消耗:13.5 MB, 在所有 Python3 提交中击败了14.80% 的用户
大神解答
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
start = maxLength = 0
usedChar = {}
for index,char in enumerate(s):
if char in usedChar and start <= usedChar[char]:
start = usedChar[char] + 1
else:
maxLength = max(maxLength, index - start + 1)
usedChar[char] = index
return maxLength
执行用时:44 ms, 在所有 Python3 提交中击败了99.97% 的用户
内存消耗:13.3 MB, 在所有 Python3 提交中击败了81.26% 的用户
ps :
此代码为leetcode排名靠前的他人所写
为了理清楚逻辑重新改写了一下大神的代码:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
start = maxLength = 0
usedChar = {}
res=""
for index, char in enumerate(s):
# print("===" ,index , char)
if char in usedChar and start <= usedChar[char]:
# print('usedChar[char] :',usedChar[char])
start = usedChar[char] + 1
# print('start :',start)
res=s[usedChar[char] : index]
print('res :' ,res)
else:
# maxLength = max(maxLength, index - start + 1)
# print('maxLength :', maxLength)
res=res+char
if len(res)>maxLength:
maxLength=len(res)
print('res :' ,res)
usedChar[char] = index
return maxLength
通过对比 res 和 输入值s 来理解大神的代码