描述:
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 40,000.
The order of output does not matter.
样例:
Given s = "cbaebabacd"
p = "abc"
return [0, 6]
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".
思路:
首先遍历字符串s,截取以p中字符起始且与p等长的字符串,然后进入search进行判断,截取字符串是否与p包含相同的字符。
public class Solution {
/**
* @param s a string
* @param p a non-empty string
* @return a list of index
*/
public List<Integer> findAnagrams(String s, String p) {
// Write your code here
List<Integer> result = new ArrayList<Integer>();
if(s == null || s.length() == 0){
return result;
}
for(int i = 0;i <= s.length() - p.length();i++){
if(p.indexOf(s.charAt(i)) >= 0){
String temp = s.substring(i , i+p.length());
search(temp , p , i , result);
}
}
return result;
}
public void search(String test , String p , int index , List<Integer> result){
int[] record = new int[26];
for(int i = 0;i<26;i++){
record[i] = 0;
}
for(int i = 0;i<test.length();i++){
record[test.charAt(i) - 'a']++;
}
for(int i = 0;i<p.length();i++){
if(record[p.charAt(i) - 'a'] < 1){
return;
}else{
record[p.charAt(i) - 'a']--;
}
}
for(int i = 0;i<26;i++){
if(record[i] != 0){
return;
}
}
result.add(index);
}
}