最近在学习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去重的解法反而速度更快,估计和测试用例相对规模比较小有关。
留言