「Day5」40 天带你玩转 leetcode hot 100 「leetcode438」

94 阅读2分钟

一、题目

438. 找到字符串中所有字母异位词

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

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

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

更多细节请参看官方题目详情

二、题解

2.1 滑动窗口

滑动窗口(Sliding Window)是一种算法思想,用于解决一类涉及连续区间的问题。它可以将问题转化为对区间的扫描,并在扫描过程中动态维护一个窗口(一段连续的区间),从而实现对区间进行快速处理的目的。

具体来说,滑动窗口算法通常通过两个指针start和end来表示当前维护的窗口区间[start, end],然后根据问题要求对该区间进行更新。在算法执行的过程中,start和end会向右依次移动,以扩大或缩小窗口的大小,并根据问题要求更新窗口内的内容。整个过程中,通过适当调整start和end指针的移动方式,可以让算法在O(N)的时间内完成对整个区间的扫描和处理。

滑动窗口算法的时间复杂度通常为O(N),空间复杂度为O(1),因此在解决一些连续区间相关的问题时,是一种非常高效的算法思想。

2.2 思路分析

s = "cbaebabacd", p = "abc"

scbaebabacd目标字符个数起始索引结果集|
下标0123456789
滑动窗口l...r1:1:10
滑动窗口l...r1:1:00
标题
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        
    }
};

三、总结

题目知识点进度
136数组、位运算(异或)、哈希表1
121数组、动态规划2
3字符串、滑动窗口、哈希表3
131字符串、回溯、动态规划4
438字符串、滑动窗口、哈希表5