1. 程式人生 > 實用技巧 >最大單詞長度乘積(力扣第318題)

最大單詞長度乘積(力扣第318題)

318. 最大單詞長度乘積

​ 給定一個字串陣列 words,找到 length(word[i]) * length(word[j]) 的最大值,並且這兩個單詞不含有公共字母。你可以認為每個單詞只包含小寫字母。如果不存在這樣的兩個單詞,返回 0。

示例 1:

輸入: ["abcw","baz","foo","bar","xtfn","abcdef"]
輸出: 16 
解釋: 這兩個單詞為 "abcw", "xtfn"。

示例 2:

輸入: ["a","ab","abc","d","cd","bcd","abcd"]
輸出: 4 
解釋: 這兩個單詞為 "ab", "cd"。

示例 3:

輸入: ["a","aa","aaa","aaaa"]
輸出: 0 
解釋: 不存在這樣的兩個單詞。

分析:

​ 最大的問題在於如何判斷陣列中兩兩字串之間是否含有重複的字母,因為字母只有26個,所以我們可以使用一個32位的二進位制數對每一個字串進行編碼,每一個字母從a到z對應於32位二進位制數中的1-26這些位置,如果當前字串中出現了某個字母,那麼這個字母對應位置就為1,否則為0。那麼最終的判斷兩個字串是否含有重複的字母就可以通過兩個字串對應的編碼值進行&運算然後判斷結果值是否為0來判斷了。如果為0,說明沒有相同的字母;否則就有。

​ 對於沒有相同字母的字串,兩兩計算長度乘積,求出最大的乘積值。

public int maxProduct(String[] words) {

    if (words == null || words.length == 0){
        return 0;
    }
    int n = words.length;
    int[] flag = new int[n];
    int res = 0;
    for (int i = 0; i < words.length; i++) {

        for (char c : words[i].toCharArray()) {
            flag[i] |= 1 << (c - 'a');
        }
    }

    for (int i = 0; i < n; i++) {

        for (int j = i + 1; j < n; j++) {

            if ((flag[i] & flag[j]) != 0 ){
                continue;
            }

            res = Math.max(res,words[i].length() * words[j].length());
        }
    }

    return res;
}