题目要求:
Given a string s and a non-empty string p, find all the start indices of p's anagrams in s.
Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.
The order of output does not matter.
Example 1:
Input: s: "cbaebabacd" p: "abc" Output: [0, 6] Explanation: The substring with start index = 0 is "cba", which is an anagram of "abc". The substring with start index = 6 is "bac", which is an anagram of "abc".
Example 2:
Input: s: "abab" p: "ab" Output: [0, 1, 2] Explanation: The substring with start index = 0 is "ab", which is an anagram of "ab". The substring with start index = 1 is "ba", which is an anagram of "ab". The substring with start index = 2 is "ab", which is an anagram of "ab".
题目虽然是EASY但是一点也不简单,使用划窗法进行处理
这个代码时间超时
public class Solution {
public List<Integer> findAnagrams(String s, String p) {
//使用暴力搜索的方法进行处理
//这种方法计算时间超时
List<Character> set = new LinkedList<>();
List<Character> setTem = new LinkedList<>();
List<Integer> list = new ArrayList<>();
char[] arr = p.toCharArray();
for(char c : arr) set.add(c);
int num = arr.length;
for(int i = 0; i < s.length() - num + 1; i++) {
setTem.clear();
setTem.addAll(set);
for(int j = 0; j < num; j++) {
if(setTem.contains(s.charAt(i + j))) setTem.remove((Character) s.charAt(i + j));
else break;
if(setTem.size() == 0) list.add(i);
}
}
return list;
}
}
滑窗法可以
public class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> list = new ArrayList<>();
if(s.length() == 0 || p.length() == 0 || p.length() > s.length()) return list;
int[] hasharr = new int[256];
char[] arrp = p.toCharArray();
for (char c : arrp) hasharr[c]++;
int right = 0, left = 0;
int count = p.length();
while(right < s.length()) {
if(hasharr[s.charAt(right++)]-- >= 1) count--;
if(count == 0) list.add(left);
if(right - left == p.length() && hasharr[s.charAt(left++)]++ >= 0) count++;
}
return list;
}
}