題目要求:
Given a string, find the length of the longest substring without repeating characters.
主要思路:
除了brute force之外吁脱,可以使用sliding window的思路來(lái)解決遍蟋,即在碰到與前面的substring相同的character的時(shí)候?qū)ubstring向右滑動(dòng)再重新尋找柿祈。
代碼:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
start = maxLength = 0
usedChar = {}
for i in range(len(s)):
if s[i] in usedChar and start <= usedChar[s[i]]:
start = usedChar[s[i]] + 1
else:
maxLength = max(maxLength, i - start + 1)
usedChar[s[i]] = i
return maxLength
代碼中的start記錄起始位置,當(dāng)遇到substring中存在相同的character的情況計(jì)算一次此時(shí)的長(zhǎng)度翘魄,并更新最大長(zhǎng)度。這里注意usedChar是會(huì)不斷更新到最大下標(biāo)的,因?yàn)榍懊嫜h(huán)的原因禁添,舊的usedChar已經(jīng)被sliding window滑過(guò)了,所以必須更新useChar桨踪。
2019重刷老翘,本來(lái)想用,遞歸锻离,通過(guò)分治法求解铺峭,但這其實(shí)相當(dāng)于返回了最長(zhǎng)的不重復(fù)可間斷子列,和實(shí)際要求差異較大汽纠。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if s is None or len(s)==0:
return 0
if len(s)==1:
return 1
for i in range(1,len(s)):
if s[i]==s[0]:
return max(self.lengthOfLongestSubstring(s[i:len(s)]),self.lengthOfLongestSubstring(s[0:i]))
第三種思路:
使用hashmap和滑動(dòng)時(shí)間窗口來(lái)實(shí)現(xiàn)卫键,這種方法在于hashmap的巧妙運(yùn)用以及滑動(dòng)時(shí)間窗口的結(jié)合。
在python中用dict即字典來(lái)代替其他語(yǔ)言中的哈希表虱朵,字典其實(shí)就是一種特定的哈希表莉炉。
代碼的實(shí)現(xiàn)主要在于定義字典,左邊界以及右邊界碴犬。dic={}絮宁,字典里面每個(gè)值都是相應(yīng)的char的位置,l,r分別是當(dāng)前窗口的左邊界以及右邊界服协。當(dāng)遍歷字符串绍昂,出現(xiàn)與字典中現(xiàn)有的重復(fù)的,則更新左邊界為dict[s[r]]+1。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
dic = {}
l,res = 0,0
for r in range(len(s)):
if s[r] in dic:
l = max(dic[s[r]]+1,l)
dic[s[r]] = r
res = max(res,r-l+1)
return res