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
    }
}
原文地址:https://www.cnblogs.com/ganshuoos/p/14105855.html