找到字符串中所有字母异位词 Java
·

暴力解法:
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> list = new ArrayList();
char[] pChars = p.toCharArray();
Arrays.sort(pChars); // 给p排序以便判断
int n = pChars.length;
for (int i = 0; i <= s.length() - n; i++) { // 这边注意是"<="不然会漏掉一个
char[] cur = s.substring(i, i + n).toCharArray(); // 截取当前索引的子串
Arrays.sort(cur); // 给当前子串排序
if (Arrays.equals(cur, pChars)) list.add(i); // 子串等于p,添加索引到list中
}
return list;
}
}
滑动窗口:
class Solution {
public List<Integer> findAnagrams(String s, String p) {
if (s.length() < p.length()) return new ArrayList(); // 给的字符串长度小于目标长度直接返回空列表
List<Integer> list = new ArrayList(); // 存放结果
Map<Character, Integer> pMap = new HashMap(), winMap = new HashMap(); // pMap存放目标p中每个字符的数量,winMap存放滑动窗口的字符数量
for (char ch : p.toCharArray()) pMap.put(ch, pMap.getOrDefault(ch, 0) + 1); // 填充pMap
int pLen = p.length();
char[] chars = s.toCharArray();
int l = 0, r = 0, count = 0; // 定义左、右指针,窗口中已经满足目标字符的个数
while (r < chars.length) {
char chR = chars[r];
if (pMap.containsKey(chR)) { // 判断右指针上的字符为目标字符
winMap.put(chR, winMap.getOrDefault(chR, 0) + 1); // 表中该字符对应值加一(添加该字符到窗口)
if (winMap.get(chR) <= pMap.get(chR)) count++; // 只要窗口中该字符数量没超过目标中该字符数量就count++
}
while (count == pLen) { // 判断窗口中含有目标所有字符
if (r - l + 1 == pLen) list.add(l); // 如果窗口长度也和目标一致,则找到一个结果,否则需要利用左指针去除非目标字符
char chL = chars[l];
if (pMap.containsKey(chL)) { // 判断左指针上的字符为目标字符
winMap.put(chL, winMap.getOrDefault(chL, 0) - 1); // 表中该字符对应值加一(从窗口移除该字符)
if (winMap.get(chL) < pMap.get(chL)) count--; // 与前面的同理,使count维持在满足目标字符个数的范围内
}
l++; // 只要窗口含有所有目标字符,就继续右移左指针,同时去除非目标字符
}
r++;
}
return list;
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
更多推荐



所有评论(0)