leetcode力扣-剑指offer刷题-day4-005. 单词长度的最大乘积

剑指 Offer II 005. 单词长度的最大乘积 题解 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/aseY1I/solution/

给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值。假设字符串中只包含英语的小写字母。如果没有不包含相同字符的一对字符串,返回 0。

示例 1:

输入: words = ["abcw","baz","foo","bar","fxyz","abcdef"]
输出: 16 
解释: 这两个单词为 "abcw", "fxyz"。它们不包含相同字符,且长度的乘积最大。

看了下没啥比较好的思路,硬要写的话会非常复杂。

class Solution {
    public int maxProduct(String[] words) {
        int result=0;
        for(int i=0;i<words.length;i++){
            for(int j=i+1;j<words.length;j++){
                if(isSame(words[i],words[j])==false){
                    if(words[i].length()*words[j].length()>result){
                        result=words[i].length()*words[j].length();
                    }
                }
            }
        }
        return result;
    }
    private boolean isSame(String a,String b) {
        boolean same=false;
        char[]arrA = a.toCharArray();
        char[]arrB = b.toCharArray();
        for(int i=0;i<arrA.length;i++){
            for(int j=0;j<arrB.length;j++){
                if(arrA[i]==arrB[j]){
                   same=true; 
                   System.out.println("same"+arrA[i]);break;
                }
            }
        }
        return same;
    }
}

这样写时间会超出限制,看一看评论区大佬写法。 

 对于验证两个单词长度的最大乘积,首先需要每两个单词都比较一遍,这个就没办法避免了……

考虑加快判断两个字符串是否包含相同的字符:

首先,需要一个单词中的每一个字符都保存起来
之后,比较依次比较两个单词中每一个字符,确定或者都没出现过,或者只有一个单词中出现过
考虑二进制值 与 的特性, 0 & 0 = 0, 0 & 1 = 1 & 0 = 0, 1 & 1 =1 ,刚好符合要求
用一个数字二进制表示中的每一位记录一个字母是否出现,例如,字符串 ac 可以用 00000000 00000000 00000000 00000101 = 3 表示
将每一个字符串中字母是否出现均用一个数字表示表示出来,当比较两个字符串是否存在相同字母时,使用 num1 & num2 == 0 就可以轻易判断出来了(๑╹◡╹)ノ"""

  public int maxProduct(String[] words) {
        int[] wordCode = this.initWordCode(words);
        int result = 0;
        for (int i = 0, end = words.length; i < end; i++) {
            for (int j = i + 1; j < end; j++) {
                if ((wordCode[i] & wordCode[j]) == 0) {
                    result = Math.max(result, words[i].length() * words[j].length());
                }
            }
        }
        return result;
    }

    private int[] initWordCode(String[] words) {
        int[] wordCode = new int[words.length];
        for (int i = 0, end = words.length; i < end; i++) {
            for (char letter : words[i].toCharArray()) {
                wordCode[i] |= (1 << (letter - 'a'));
            }
        }
        return wordCode;
    }

作者:huaLuoYueQue
链接:https://leetcode-cn.com/problems/aseY1I/solution/hua-luo-yue-que-bei-li-yong-che-di-de-er-loai/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值