知识储备--基础算法篇-滑动窗口

1.滑动窗口

1.1第3题-无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

心得:用哈希表来一点点遍历,但是因为哈希表占内存,我又是两个循环遍历,所以速度又慢,占的内存还多。 

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        if len(s)==0:
            return 0
        max_ = 1
        for i in range(len(s)):
            hash_table = {}
            max_temp = 0
            for j in range(i,len(s)):
                if s[j] not in hash_table:
                    hash_table[s[j]] = 1
                    max_temp += 1
                    if max_ < max_temp:
                        max_ = max_temp
                else:
                    break
        return max_

知识储备--基础算法篇-滑动窗口_第1张图片

看了解析,我的整体思路差不多,不过他用了滑动窗口,计算量少了很多 ,而且一开始没有理解left的含义,left是用来从窗口的左边开始删除元素,直到哈希表中没有相同的元素为止。还有就是用set()不要用{},set需要使用add和remove。

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        if len(s)==0:
            return 0
        max_len = 0
        hash_table = set()
        cur_len = 0
        left = 0
        for j in range(len(s)):
            cur_len += 1
            while s[j] in hash_table:
                hash_table.remove(s[left])
                left += 1
                cur_len -= 1
            if max_len < cur_len:
                max_len = cur_len
            hash_table.add(s[j])
        return max_len

知识储备--基础算法篇-滑动窗口_第2张图片

1.2第438题-找到字符串中所有字符异位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

心得:思路很简单,早早的就想出来了,但是关于滑动窗口与给定字符串相等的逻辑却想了半天,最终决定用字典来记录,重复出现的字符就对字典中该字符的值加一,滑动的时候删除或减一。字典删除的操作使用del。

参考答案中是用数组来存储每个字母的个数

class Solution(object):
    def findAnagrams(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: List[int]
        """
        if len(s) < len(p):
            return []
        elif s == p:
            return [0]
        target_dict = {}
        n = len(p)
        for i in range(n):
            if p[i] not in target_dict:
                target_dict[p[i]] = 1
            else:
                target_dict[p[i]] = target_dict[p[i]] + 1
        result = []
        result_dict = {}
        for i in range(n-1):
            if s[i] not in result_dict:
                result_dict[s[i]] = 1
            else:
                result_dict[s[i]] = result_dict[s[i]] + 1
        for i in range(len(s)-n+1):
            if s[i+n-1] not in result_dict:
                result_dict[s[i+n-1]] = 1
            else:
                result_dict[s[i+n-1]] = result_dict[s[i+n-1]] + 1
            if result_dict == target_dict:
                result.append(i)
            if result_dict[s[i]] == 1:
                del result_dict[s[i]]
            else:
                result_dict[s[i]] = result_dict[s[i]] - 1
        
        return result

知识储备--基础算法篇-滑动窗口_第3张图片

你可能感兴趣的:(算法)