先上一个我自己的暴力解法
public class Solution {
public List<Integer> findAnagrams(String s, String p) {
int[] hash = hashPattern(p);
List<Integer> result = new ArrayList<Integer>();
int sLength = s.length(),pLength = p.length();
for(int i = 0;i <= sLength - pLength;i++){
int[] subHash = hashPattern(s.substring(i,i+pLength));
if(check(hash,subHash)){
result.add(i);
}
}
return result;
}
private int[] hashPattern(String p){
int[] hash = new int[26];
char[] pArray = p.toCharArray();
for(int i = 0;i < p.length();i++){
hash[pArray[i] - 'a']++;
}
return hash;
}
private boolean check(int[] hashA,int[] hashB){
boolean result = true;
for(int i = 0;i<hashA.length;i++){
if(hashA[i] != hashB[i]){
//System.out.println("unequal");
result = false;
}
}
return result;
}
}
下面是我自己优化后的方法,思想就是在暴力基础上匹配的字符处,查看新增的字符与去掉的字符是否一致,一致则新字符串也匹配。
public class Solution {
public List<Integer> findAnagrams(String s, String p) {
int[] hash = hashPattern(p);
List<Integer> result = new ArrayList<Integer>();
int sLength = s.length(),pLength = p.length();
int preTIndex = - pLength;
char[] sArray = s.toCharArray();
for(int i = 0;i <= sLength - pLength;i++){
if(i - preTIndex >= pLength - 1){
int[] subHash = hashPattern(s.substring(i,i+pLength));
if(check(hash,subHash)){
result.add(i);
preTIndex = i;
}
}else if(i - preTIndex == 1){
if(sArray[preTIndex] == sArray[i + pLength - 1]){
result.add(i);
preTIndex = i;
}
}
}
return result;
}
private int[] hashPattern(String p){
int[] hash = new int[26];
char[] pArray = p.toCharArray();
for(int i = 0;i < p.length();i++){
hash[pArray[i] - 'a']++;
}
return hash;
}
private boolean check(int[] hashA,int[] hashB){
boolean result = true;
for(int i = 0;i<hashA.length;i++){
if(hashA[i] != hashB[i]){
//System.out.println("unequal");
result = false;
}
}
return result;
}
}
2016/12/1