LeetCode438. 找到字串中所有字母異位詞
阿新 • • 發佈:2020-12-08
一、題目描述
☆☆☆二、解法
思路:滑動視窗法。用字母字典法判斷兩個詞是否為字母異位詞。
程式碼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 = newint[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; } }