LeetCode 318. Maximum Product of Word Lengths(最大单词长度乘积)

该博客介绍了LeetCode 318题目的解题思路,寻找字符串数组中两个单词的最大长度乘积,要求这两个单词没有相同字母。文章提到了两种方法,一种是通过直方图统计,另一种是利用比特哈希进行快速比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题网址:https://leetcode.com/problems/maximum-product-of-word-lengths/

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0.

Example 1:

Given ["abcw", "baz", "foo", "bar", "xtfn", "abcdef"]
Return 16
The two words can be "abcw", "xtfn".

Example 2:

Given ["a", "ab", "abc", "d", "cd", "bcd", "abcd"]
Return 4
The two words can be "ab", "cd".

Example 3:

Given ["a", "aa", "aaa", "aaaa"]
Return 0
No such pair of words.

方法:可以通过直方图统计来比较两个单词是否有共同的字母,但有个更快捷的方法就是使用26个比特来比较。

public class Solution {
    private int hash(char[] wa) {
        int hash = 0;
        for(int i=0; i<wa.length; i++) {
            hash |= (1<<(wa[i]-'a'));
        }
        return hash;
    }    
    public int maxProduct(String[] words) {
        char[][] was = new char[words.length][];
        int[] hashes = new int[words.length];
        for(int i=0; i<words.length; i++) {
            was[i] = words[i].toCharArray();
            hashes[i] = hash(was[i]);
        }
        int max = 0;
        for(int i=0; i<words.length-1; i++) {
            for(int j=i+1; j<words.length; j++) {
                if ((hashes[i] & hashes[j]) == 0) {
                    int m = was[i].length * was[j].length;
                    if (m > max) max = m;
                }
            }
        }
        return max;
    }
}

方法二:使用比特进行哈希。

public class Solution {
    public int maxProduct(String[] words) {
        int[] f = new int[words.length];
        for(int i=0; i<words.length; i++) {
            char[] wa = words[i].toCharArray();
            for(int j=0; j<wa.length; j++) {
                f[i] |= 1 << (wa[j]-'a');
            }
        }
        int max = 0;
        for(int i=0; i<words.length-1; i++) {
            for(int j=i+1; j<words.length; j++) {
                if ((f[i] & f[j]) == 0) max = Math.max(max, words[i].length() * words[j].length());
            }
        }
        return max;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值