LeetCode //C - 318. Maximum Product of Word Lengths

318. Maximum Product of Word Lengths

Given a string array words, return the maximum value of length(wordi) * length(wordj) where the two words do not share common letters. If no such two words exist, return 0.

Example 1:

Input: words = "abcw","baz","foo","bar","xtfn","abcdef"
Output: 16
Explanation: The two words can be "abcw", "xtfn".

Example 2:

Input: words = "a","ab","abc","d","cd","bcd","abcd"
Output: 4
Explanation: The two words can be "ab", "cd".

Example 3:

Input: words = "a","aa","aaa","aaaa"
Output: 0
Explanation: No such pair of words.

Constraints:
  • 2 <= words.length <= 1000
  • 1 <= wordsi.length <= 1000
  • wordsi consists only of lowercase English letters.

From: LeetCode

Link: 318. Maximum Product of Word Lengths


Solution:

Ideas:

1. hasCommonLetters Function:

  • This function uses bit manipulation to determine if two words share any common letters. Each word is represented by a 26-bit integer, where each bit corresponds to a letter ('a' to 'z').
  • By iterating through each character of the words and setting the corresponding bit, we can check if any bit is set in both words using the bitwise AND operator.

2. maxProduct Function:

  • The main function iterates through all pairs of words, checking if they share any common letters using the hasCommonLetters function.
  • If they don't share any letters, it calculates the product of their lengths and updates the maxProduct if the current product is greater.

3. Efficiency:

  • The solution is optimized using bit manipulation to quickly check for common letters, making it suitable for larger input sizes within the given constraints.
Code:
c 复制代码
// Function to check if two words share common letters
int hasCommonLetters(const char* word1, const char* word2) {
    int letters1 = 0, letters2 = 0;

    // Mark presence of each character in the first word
    while (*word1) {
        letters1 |= 1 << (*word1 - 'a');
        word1++;
    }

    // Mark presence of each character in the second word
    while (*word2) {
        letters2 |= 1 << (*word2 - 'a');
        word2++;
    }

    // If there is any common letter, the AND of the two will be non-zero
    return letters1 & letters2;
}

int maxProduct(char** words, int wordsSize) {
    int maxProduct = 0;

    // Iterate through all pairs of words
    for (int i = 0; i < wordsSize; i++) {
        for (int j = i + 1; j < wordsSize; j++) {
            // Check if words[i] and words[j] share common letters
            if (!hasCommonLetters(words[i], words[j])) {
                int product = strlen(words[i]) * strlen(words[j]);
                if (product > maxProduct) {
                    maxProduct = product;
                }
            }
        }
    }

    return maxProduct;
}
相关推荐
code bean几秒前
平衡相关性与多样性:推荐系统中的永恒博弈与 MMR 算法详解
算法
青梅橘子皮6 分钟前
Linux---进程控制(2)(进程程序替换)
linux·c++·算法
Shan12059 分钟前
经典问题——验证栈序列
数据结构·算法
2501_9065651222 分钟前
勾股定理证明
算法
Shan12051 小时前
无向图的Hierholzer算法流程(二)
算法
gihigo19981 小时前
基于蒙特卡洛的异常值剔除(RANSAC + MC置信区间)—MATLAB实现
开发语言·算法·matlab
Aurorar0rua1 小时前
CS50 x 2024 Notes Arrays - 04
c语言·开发语言·学习方法
Asize1 小时前
数组数据结构底层:从灵活到陷阱
前端·javascript·算法
wuminyu2 小时前
Java世界中StringTable源码剖析
java·linux·c语言·jvm·c++
hairenwangmiao2 小时前
B4041 [GESP202409 四级] 区间排序
算法·排序