题目要求:
Given a string, find the length of the longest substring without repeating characters.
主要思路:
除了brute force之外,可以使用sliding window的思路来解决,即在碰到与前面的substring相同的character的时候将substring向右滑动再重新寻找。
代码:
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记录起始位置,当遇到substring中存在相同的character的情况计算一次此时的长度,并更新最大长度。这里注意usedChar是会不断更新到最大下标的,因为前面循环的原因,旧的usedChar已经被sliding window滑过了,所以必须更新useChar。
2019重刷,本来想用,递归,通过分治法求解,但这其实相当于返回了最长的不重复可间断子列,和实际要求差异较大。
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和滑动时间窗口来实现,这种方法在于hashmap的巧妙运用以及滑动时间窗口的结合。
在python中用dict即字典来代替其他语言中的哈希表,字典其实就是一种特定的哈希表。
代码的实现主要在于定义字典,左边界以及右边界。dic={},字典里面每个值都是相应的char的位置,l,r分别是当前窗口的左边界以及右边界。当遍历字符串,出现与字典中现有的重复的,则更新左边界为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