力扣:最长单次长度乘积

题目描述


给定一个字符串数组 words,找到 length(word[i]) * length(word[j])最大值,并且这 两个单词不含有公共字母 。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。
力扣:318. 最长单次长度乘积

输入: [“abcw” , “baz” , “foo” , “bar” , “xtfn” , “abcdef”]
输出: 16
解释: 这两个单词为 “abcw” , “xtfn”。

题目分析


废物我:暴力的解法,两两进行比较,每次比较都需要遍历两个字符串,进行判断是否包含重复字符。
大佬就是大佬,思路非常牛逼,将字符串转换成二进制串,例如 abc --> 111 = 7 , 而 abcf --> 100111 = 39, 将所有的字符串进行预处理后,得到每个字符串对应的数字, 如果两个数字 进行位运算 & 结果为 0, 那么说明没有共同的字母,算其长度的乘积,并保留最大的值。

class Solution {
    public int maxProduct(String[] words) {
        int[] nums = new int[words.length];
        for(int i = 0 ; i < words.length; i ++){
            for(int j = 0 ; j < words[i].length() ; j ++){
                nums[i] |= 1 << (words[i].charAt(j) - 'a');
            }
        }
        int maxSn = 0;
        // 暴力求解,两两进行判断
        for(int i = 0 ; i < nums.length -1 ; i ++){
            int num1 = nums[i];
            for(int j = i + 1 ; j < nums.length ; j ++){
                int num2 = nums[j];
                if( (num1 & num2) == 0){
                    int sn = words[i].length() * words[j].length();
                    maxSn = Math.max(maxSn , sn);
                }
            }
        }
        return maxSn;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值