OA原题描述参考:
注意:具体抽到的题目可能会有细微变化。
leetcode 438 原题
解题思路参考:
hash存字符s所有字符的出现频率。然后对p的字符进行滑动窗口查找,符合条件就记录位置。
参考答案:
public class Solution {
public List<Integer> findAnagrams(String s, String p) {
// using pointers to keep a window
List<Integer> res = new ArrayList<Integer>();
if (s == null || p == null || s.length() < p.length()) {
return res;
}
char[] source = s.toCharArray();
char[] target = p.toCharArray();
char[] pHash = new char[26];//only 26 characters
char[] sHash = new char[26];
for (char sc : target) {
pHash[sc - 'a']++;
}
//start from 1st windows
for (int i = 0; i < target.length; i++) {
sHash[source[i] - 'a']++;
}
if (check(pHash, sHash)) {
res.add(0);
}
for (int i = target.length; i < source.length; i++) {
sHash[source[i - target.length] - 'a']--;
sHash[source[i] - 'a']++;
if (check(pHash, sHash)) {
res.add(i - target.length + 1);
}
}
return res;
}
private boolean check(char[] hash, char[] window) {
for (int i = 0; i < hash.length; i++) {
if (hash[i] != window[i]) {
return false;
}
}
return true;
}
}