1. 程式人生 > 實用技巧 >leetcode刷題筆記318題 最大單詞長度乘積

leetcode刷題筆記318題 最大單詞長度乘積

leetcode刷題筆記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
解釋: 不存在這樣的兩個單詞。

//核心問題: 判斷兩個單詞之間的是否存在重複字母
//核心思想: 使用一個32位數的每位的01情況標註當前字母是否出現
//構建陣列strArr儲存每個單詞的字母情況
//當i對應的字母情況與j對應的字母情況取與不為0 則存在重複字母
object Solution {
    def maxProduct(words: Array[String]): Int = {
        val strArr = Array.fill(words.length)(0)
        for (i <- 0 to words.length-1) {
            var temp = 0
            var word = words(i)
            for (char <- word){
                temp |= (1 << (char - 'a'))
            }
            strArr(i) = temp
        }

        var res = 0
        for (i <- 0 to words.length-1) {
            for (j <- i+1 to words.length-1) {
                if ((strArr(i) & strArr(j)) == 0){
                    res = math.max(res, words(i).length * words(j).length)
                }
            }
        }

        return res
    }
}
func maxProduct(words []string) int {
    arrStr := make([]int, len(words))
    for i, word := range words {
        temp := 0
        for _, strChar :=  range word {
            temp |= (1 << (strChar - 'a'))
        }
        arrStr[i] = temp
    }

    res := 0
    for i := 0; i < len(words); i++ {
        for j := i+1; j < len(words); j++{
            if arrStr[i] & arrStr[j] == 0{
                res = max(res, len(words[i]) * len(words[j]))
            }
        }
    }
    return res
}

func max(a, b int) int {
    if a > b {
        return a
    } else {
        return b
    }
}