318. 最大单词长度乘积

100 阅读1分钟

题目:
给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。
解法:
1、将words的元素按二进制转换,
2、利用二进制与的特性判断有没有重复的字符

func maxProduct(words []string) int {
	ans := 0
	// 保存word index和对应的二进制转换
	wordBinaryMap := make(map[int]int)
	for i := 0; i < len(words); i++ {
		binary := 0
		for _, elem := range words[i] {
			pos := elem - 'a'
			binary = binary | (1 << pos)
		}
		wordBinaryMap[i] = binary
	}

	for i := 0; i < len(words); i++ {
		for j := 0; j < i; j++ {
			if (wordBinaryMap[i] & wordBinaryMap[j]) == 0 {
				cal := len(words[i]) * len(words[j])
				if cal > ans {
					ans = cal
				}
			}
		}
	}
	return ans
}