LeetCode 318. 最大单词长度乘积

本文介绍了一种利用位运算解决字符串问题的方法。给定一个字符串数组,通过计算每对字符串的长度乘积,找出不含公共字母的两字符串,以获得最大的长度乘积。文章提供了完整的代码实现,展示了如何将字符串转换为二进制表示,以及如何检查两字符串是否含有公共字母。
摘要由CSDN通过智能技术生成

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

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

可以用位运算来做,假如两个字符串包含公共字母,二进制与的结果一定不是0

//获得字符串二进制
for(int i=0;i<str.length();i++){
    num|=1<<a.charAt(i)-'a';
}

完整代码

public class Main {
    public static void main(String[] args) {
        String[] s = new String[]{"abcw","baz","foo","bar","xtfn","abcdef"};
        System.out.println(new Main().maxProduct(s));
    }

    public int maxProduct(String[] words) {
        int wordslen = words.length;
        //存每个字符串的二进制数
        int[] num = new int[wordslen];
        //存最大乘积数
        int ans = 0;
        for(int i=0;i<wordslen;i++){
            int len = words[i].length();
            for(int j=0;j<len;j++){
                num[i]|=1<<(words[i].charAt(j)-'a');
            }
        }
        for(int i=0;i<wordslen;i++){
            for(int j=i+1;j<wordslen;j++){
                //无公共字母
                if((num[i]&num[j])==0){
                    ans = Math.max(ans,words[i].length()*words[j].length());
                }
            }
        }
        return ans;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值