一、题目
给定两个字符串 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"
| s | c | b | a | e | b | a | b | a | c | d | 目标字符个数 | 起始索引结果集| | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |||
| 滑动窗口 | l | ... | r | 1:1:1 | 0 | ||||||||
| 滑动窗口 | l | ... | r | 1:1:0 | 0 |
| 标题 | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
}
};
三、总结
| 题目 | 知识点 | 进度 |
|---|---|---|
| 136 | 数组、位运算(异或)、哈希表 | 1 |
| 121 | 数组、动态规划 | 2 |
| 3 | 字符串、滑动窗口、哈希表 | 3 |
| 131 | 字符串、回溯、动态规划 | 4 |
| 438 | 字符串、滑动窗口、哈希表 | 5 |