题目描述
给定两个字符串 s
和 p
,找到 s
中所有 p
的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba"
, 它是 "abc"
的异位词。
起始索引等于 6 的子串是 "bac"
, 它是 "abc"
的异位词。
示例 2:
输入: s = "abab"
, p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab"
, 它是 "ab"
的异位词。
起始索引等于 1 的子串是 "ba"
, 它是 "ab"
的异位词。
起始索引等于 2 的子串是 "ab"
, 它是 "ab"
的异位词。
提示:
1 <= s.length, p.length <= 3 * 10^4
s
和 p
仅包含小写字母
题解 - 滑动窗口
思路
根据题目要求,我们需要在字符串 s
寻找字符串 p
的异位词。因为字符串 p
的异位词的长度一定与字符串 p
的长度相同,所以我们可以在字符串 s
中构造一个长度为与字符串 p
的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母的数量与字符串 p
中每种字母的数量相同时,则说明当前窗口为字符串 p
的异位词。
算法
在算法的实现中,我们可以使用数组来存储字符串 p
和滑动窗口中每种字母的数量。
细节
当字符串 s
的长度小于字符串 p
的长度时,字符串 s
中一定不存在字符串 p
的异位词。但是因为字符串 s
中无法构造长度与字符串 p
的长度相同的窗口,所以这种情况需要单独处理。
代码
/**
* Function to check if a string is a match with a given character array
* @param s: input string
* @param len: length of the input string
* @param vat: character array to match against
* @return true if the string is a match, false otherwise
*/
bool stringIsMatch(char *s, int len, char *vat) {
int i;
char vatBak[26] = {
0};<