标签:滑动窗口 双指针
给定两个字符串 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 * 104s和p仅包含小写字母
思路:典型滑动窗口题目,滑动窗口关键在于窗口左右指针。直接设置p大小滑动窗口,然后将窗口子串和p比较。
leetcode版本:
java
//时间复杂度O(Nmlogm) ,N是s长度,m是p长度
public List<Integer> findAnagrams(String s, String p) {
List<Integer> findAnagrams = new ArrayList<>();
int i = 0;
int j = i + p.length();
char [] pChars = p.toCharArray();
Arrays.sort(pChars);
p = new String(pChars);
while(j <= s.length()){
String sub_s = s.substring(i, j);
char[] temp = sub_s.toCharArray();
Arrays.sort(temp);
sub_s = new String(temp);
if(sub_s.equals(p)){
findAnagrams.add(i);
}
i++;
j++;
}
return findAnagrams;
}
本地IDE版本:
java
public class leetcode438 {
//时间复杂度O(Nmlogm) ,N是s长度,m是p长度
public List<Integer> findAnagrams(String s, String p) {
List<Integer> findAnagrams = new ArrayList<>();
int i = 0;
int j = i + p.length();
char [] pChars = p.toCharArray();
Arrays.sort(pChars);
p = new String(pChars);
while(j <= s.length()){
String sub_s = s.substring(i, j);
char[] temp = sub_s.toCharArray();
Arrays.sort(temp);
sub_s = new String(temp);
if(sub_s.equals(p)){
findAnagrams.add(i);
}
i++;
j++;
}
return findAnagrams;
}
public static void main(String[] args) {
leetcode438 leetcode438 = new leetcode438();
String s = "abab";
String p = "ab";
System.out.println(leetcode438.findAnagrams(s, p));
}
}