1. 程式人生 > 實用技巧 >LeetCode438. 找到字串中所有字母異位詞

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;
    }
}