Description:
Given a string, find the length of the longest substring without repeating characters.
Example1:
Input: “abcabcbb”
Output: 3
Explanation: The answer is “abc”, with the length of 3.
Example2:
Input: “bbbbb”
Output: 1
Explanation: The answer is “b”, with the length of 1.
Example3:
Input: “pwwkew”
Output: 3
Explanation: The answer is “wke”, with the length of 3.
Note that the answer must be a substring, “pwke” is a subsequence and not a substring.
思路: 两个指针一前一后遍历,复杂度高。
class Solution(object):
def lengthOfLongestSubstring(self, s):
if not s:
return 0
i,j=0,1
result=[]
while j<len(s):
if s[j] not in s[i:j]:
j+=1
else:
result.append(j-i)
i+=1
j=i+1
result.append(j-i) #到末尾时添加
return max(result)
思路: 利用滑动窗口。在遍历过程中,若遇到已经出现过的字符,则进行窗口滑动,期间用dict记录出现过的字符。注意滑动后需要在dict中删除已不在窗口中的首元素。
class Solution:
def lengthOfLongestSubstring(self, s):
if not s:
return 0
dic={}
ans,i,j=0,0,0
l=len(s)
while i<l and j<l:
if s[j] not in dic:
dic[s[j]]=j
j+=1
ans=max(ans,j-i)
else:
dic.pop(s[i])
i+=1
return ans
思路: 以上过程的优化,用index作dict中的value。
class Solution:
def lengthOfLongestSubstring(self, s):
if not s:
return 0
dic={}
ans,i,j=0,0,0
l=len(s)
while j<l:
if s[j] in dic:
i=max(dic[s[j]],i) #如果元素已经出现过,则直接滑动到该元素的位置
ans=max(ans,j-i)
ans=max(ans,j-i+1)
dic[s[j]]=j+1
j+=1
return ans