最近在学习Golang,故提供的都是自己写的Golang解法。

解法1 朴素2层遍历

func maxProduct(words []string) int {
    bits := make([]int32, len(words))
    for i, word := range words{
        for _, char := range word{
            bits[i] |= 1<<(char-'a')
        }
    }
    
    max_length := 0

    for i:=0;i<len(bits);i++{
        for j:=i+1;j<len(bits);j++{
            if len(words[i]) * len(words[j]) > max_length && bits[i]&bits[j]==0{
                max_length = len(words[i]) * len(words[j])
            }
        }
    }

    return max_length

解法2 位运算

func maxProduct(words []string) int {
    bits := make([]int32, len(words))
    for i, word := range words{
        for _, char := range word{
            bits[i] |= 1<<(char-'a')
        }
    }
    
    max_length := 0

    for i:=0;i<len(bits);i++{
        for j:=i+1;j<len(bits);j++{
            if len(words[i]) * len(words[j]) > max_length && bits[i]&bits[j]==0{
                max_length = len(words[i]) * len(words[j])
            }
        }
    }

    return max_length

解法3 掩码去重位运算

func maxProduct(words []string) int {
    masks := make(map[int32]int, 0) // {二进制掩码:单词长度}

    for _, word := range words{
        var mask int32 = 0
        for _, char := range word{
            mask |= 1<<(char-'a')
        }
        length, exist := masks[mask]
        if exist{
            if len(word)>length{
                masks[mask] = len(word)
            }
        }else{
            masks[mask] = len(word)
        }
    }
    
    max_length := 0

    for k1, v1 := range masks{
        for k2, v2 := range masks{
            if k1&k2==0 && v1*v2>max_length {
                max_length = v1*v2
            }
        }
    }

    return max_length
}

对比结果,速度上2>3>1,Go语言不使用map去重的解法反而速度更快,估计和测试用例相对规模比较小有关。

最后修改日期: 2021年11月23日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。