LeetCode318 最大单词长度乘积-----位运算

题目表述

给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。

示例:

输入: words = ["abcw","baz","foo","bar","xtfn","abcdef"]

输出: 16

解释: 这两个单词为 "abcw", "xtfn"。

位运算

  • 从题目得知,words数组是只包含小写字母的,所以共有26个小写字母,可以用int类型的数组来存储words数组中的每个字符串,因为int类型占32位,所以可以用0-25来表示字符。

  • 新建一个masks int型数组,代表每个string字符串所包含的字符。

  • 将当前字符-'a' 代表1左移的位数,也即使占32位int型中的第几位。并与其他字符做|(或运算),将字符串中所有的字符保存下来。

  • 双重循环遍历masks数组,依次做&(与)运算,如果与运算结果为0,则说明两字符串没有相同字符,计算两字符串长度乘积,并于最长字符串比较更新

class Solution {
    public int maxProduct(String[] words) {
        int[] masks = new int[words.length];
        int res = 0;
        for(int i = 0; i < words.length; i++){
            for(int j = 0; j < words[i].length();j++){
                masks[i] |= 1 << words[i].charAt(j) - 'a';
            }
        }
        for(int i = 0; i < words.length; i++){
            int temp = masks[i];
            for(int j = i; j < words.length;j++){
                if((temp & masks[j]) == 0){
                    res = Math.max(words[i].length() * words[j].length(),res);
                }
            }
        }
        return res;
    }
}
posted @ 2022-04-26 09:38  YoungerWb  阅读(27)  评论(0编辑  收藏  举报