字符串问题。给定一个字符串数组,求数组中字符串 A 和字符串 B 的长度的最大乘积,其中 A 和 B 中不能有任何相同的字母存在。
应用位掩码解决这个问题。
思路 1,暴力法
找到所有组合求最大值,用一个帮助函数 pair 来帮助我们判断是否需要进行相乘。
classSolution: defmaxProduct(self, words: List[str]) -> int: defpair(w1, w2): for w in w1: if w in w2: returnFalse returnTrue
ans, n = 0, len(words) for i inrange(n): for j inrange(i + 1, n): if pair(words[i], words[j]): ans = max(ans, len(words[i]) * len(words[j])) return ans
classSolution: defmaxProduct(self, words: List[str]) -> int: bitmasks, ans = {}, 0 for w in words: bitmask = 0 for c in w: bitmask |= 1 << (ord(c) - ord('a')) for k, v in bitmasks.items(): ifnot bitmask & k: ans = max(ans, len(w) * v) bitmasks[bitmask] = max(len(w), bitmasks.get(bitmask, 0)) # print(bitmask, ans) return ans
另一种位掩码的实现,按照下标映射位掩码,省去了 HashMap。
classSolution{ publicintmaxProduct(String[] words){ int[] bitmasks = newint[words.length]; for (int i = 0; i < words.length; i++) { for (char c : words[i].toCharArray()) { bitmasks[i] |= 1 << (c - 'a'); } } int ans = 0; for (int i = 0; i < words.length; i++) { for (int j = i + 1; j < words.length; j++) { if ((bitmasks[i] & bitmasks[j]) == 0) { ans = Math.max(ans, words[i].length() * words[j].length()); } } } return ans; } }