LeetCode 916. Word Subsets

問題

我們有兩個數組A和B的單詞。每個單詞都是一串小寫字母。現在,假設單詞b是單詞a的子集如果b中的每個字母都出現在a中,並且可以出現多次。例如,“wrr”是“warrior”的子集,但不是“world”的子集。現在說一個來自a的詞a是普遍的如果對於b中的每一個b, b是a的子集。返回a中所有通用單詞的列表。這些單詞的順序可以是任意的。

解析

題目很直觀,同樣我們給出一個更加直觀的解法。我們先將字符串數組B中出現的所有字符保存下來,並記錄次數(注意,字符串內的相同字符計數,字符串間的相同字符取最大值)。然後和A數組中的字符串逐一對比(遍歷一次),如果字符串的字符出現次數小於我們記錄的次數,那麼該字符串就不符合要求。並且時間複雜度爲O(m+n)O(m+n),其中m,n分別爲兩個字符串數組的長度。

Java代碼

    public List<String> wordSubsets(String[] A, String[] B) {
        int countsB[] = new int[26];
        for(int i=0;i<B[0].length();i++){
            countsB[B[0].charAt(i)-'a']++;
        }
        for(int i=0;i<B.length;i++){
            int temp[] = new int[26];
            for(char c:B[i].toCharArray()){
                temp[c-'a']++;
                countsB[c-'a']=Math.max(countsB[c-'a'],temp[c-'a']);
            }
        }
        List<String> list = new ArrayList();
        for(int i=0;i<A.length;i++){
            int temp[] = new int[26];
            boolean flag = true;
            for(char c:A[i].toCharArray()){
                temp[c-'a']++;
            }
            for(int j=0;j<26;j++){
                if(temp[j]<countsB[j]) {
                    flag =false;
                    break;
                }
            }
            if(flag){
                list.add(A[i]);
            }
        }
        return list;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章