3. Longest Substring Without Repeating Characters

题目地址

题目要求:

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

你可能感兴趣的:(3. Longest Substring Without Repeating Characters)