import java.util.*;
/**
* NC387 找到字符串中的异位词
* @author d3y1
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param p string字符串
* @return int整型一维数组
*/
public ArrayList findWord (String s, String p) {
// return solution1(s, p);
return solution2(s, p);
}
/**
* 滑动窗口
* @param s
* @param p
* @return
*/
private ArrayList solution1(String s, String p){
ArrayList<Integer> list = new ArrayList<>();
char[] pArr = p.toCharArray();
Arrays.sort(pArr);
String pStr = String.valueOf(pArr);
int len = s.length();
int gap = pArr.length;
char[] subArr;
String subStr;
for(int i=0; i+gap<=len; i++){
subArr = s.substring(i, i+gap).toCharArray();
Arrays.sort(subArr);
subStr = String.valueOf(subArr);
// 匹配
if(subStr.equals(pStr)){
list.add(i);
}
}
return list;
}
/**
* 双指针
* @param s
* @param p
* @return
*/
private ArrayList solution2(String s, String p){
ArrayList<Integer> list = new ArrayList<>();
// 字符串s 统计字符个数
int[] sCount = new int[26];
// 字符串p 统计字符个数
int[] pCount = new int[26];
for(char ch: p.toCharArray()){
pCount[ch-'a']++;
}
// 双指针
for(int left=0,right=0; right<s.length(); right++){
sCount[s.charAt(right)-'a']++;
while(sCount[s.charAt(right)-'a'] > pCount[s.charAt(right)-'a']){
sCount[s.charAt(left)-'a']--;
left++;
}
if(right-left+1 == p.length()){
list.add(left);
}
}
return list;
}
}