LeetCode438. 找到字符串中所有字母异位词
一、题目描述
☆☆☆二、解法
思路:滑动窗口法。用字母字典法判断两个词是否为字母异位词。
代码1:截取法。(时间效率9.25% (ㄒoㄒ)~~)
class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer> res = new ArrayList<>(); if (s == null || s.length() < p.length()) return res; int[] dict = new int[26]; int[] cur = new int[26]; for (char c : p.toCharArray()) { dict[c - 'a'] ++; } for (int i = 0; i <= s.length() - p.length(); i++) { int j = i + p.length() - 1; String temp = s.substring(i,j+1); // 结束索引(不包括)。 for (char c : temp.toCharArray()) { cur[c - 'a'] ++; } if (help(dict,cur)) { res.add(i); } Arrays.fill(cur,0); } return res; } private boolean help(int[] a, int[] b) { for (int i = 0; i < a.length; i++) { if (a[i] != b[i]) { return false; } } return true; } }
代码2:滑动窗口
class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer> res = new ArrayList<>(); if (s == null || s.length() < p.length()) return res; int[] dict = new int[26]; int[] cur = new int[26]; int l = 0, r = 0; for (char c : p.toCharArray()) { dict[c - 'a'] ++; } while (r < s.length()) { int curR = s.charAt(r) - 'a'; cur[curR] ++; r ++; // 当cur中curR 比 dict对应元素的个数多的时候,就要移动左窗口指针 while (cur[curR] > dict[curR]) { cur[s.charAt(l) - 'a'] --; l ++; } if (r - l == p.length()) { res.add(l); } } return res; } }