【Lintcode】647. Find All Anagrams in a String

題目地址:

https://www.lintcode.com/problem/find-all-anagrams-in-a-string/description

給定兩個字符串sspp,如果pp的某個排列能成爲ss的子串,則記錄下這個子串的第一個字母的下標。返回所有這樣的下標。題目保證字符串只含小寫英文字母。

思路和https://blog.csdn.net/qq_46105170/article/details/106140361類似,不同的地方只在於本題需要返回所有位置,所以每個位置都要判斷一下是否符合。代碼如下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Solution {
    /**
     * @param s: a string
     * @param p: a string
     * @return: a list of index
     */
    public List<Integer> findAnagrams(String s, String p) {
        // write your code here
        List<Integer> res = new ArrayList<>();
        if (s.length() < p.length()) {
            return res;
        }
        
        int[] pletters = new int[26], sletters = new int[26];
        for (int i = 0; i < p.length(); i++) {
            pletters[p.charAt(i) - 'a']++;
            sletters[s.charAt(i) - 'a']++;
        }
        
        if (Arrays.equals(pletters, sletters)) {
            res.add(0);
        }
    
        for (int i = p.length(); i < s.length(); i++) {
            sletters[s.charAt(i - p.length()) - 'a']--;
            sletters[s.charAt(i) - 'a']++;
            
            if (Arrays.equals(pletters, sletters)) {
                res.add(i - p.length() + 1);
            }
        }
        
        return res;
    }
}

時間複雜度O(ls)O(l_s)lsl_sss的長度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章