剑指 Offer II 005. 单词长度的最大乘积

难度中等114收藏分享切换为英文接收动态反馈

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

示例 1:

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

示例 2:

输入: words = ["a","ab","abc","d","cd","bcd","abcd"]
输出: 4 
解释: 这两个单词为 "ab", "cd"。

示例 3:

输入: words = ["a","aa","aaa","aaaa"]
输出: 0 
解释: 不存在这样的两个单词。

提示:

  • 2 <= words.length <= 1000
  • 1 <= words[i].length <= 1000
  • words[i] 仅包含小写字母

code

class Solution {
    public int maxProduct(String[] words) {
        boolean[][] flag=new boolean[words.length][26];
        for(int i=0;i<words.length;i++){
            for(char c:words[i].toCharArray()){
                flag[i][c-'a']=true;
            }
        }
        int result=0;
        for(int i=0;i<words.length;i++){
            for(int j=i+1;j<words.length;j++){
                int k=0;
                for(;k<26;k++){
                    if(flag[i][k]&&flag[j][k]){
                        break;
                    }
                }
                if(k==26){
                    int prod=words[i].length()*words[j].length();
                    result=Math.max(result,prod);
                }
            }
        }
        return result;
    }
}

时间复杂度O(nk+n方),初始化哈希表耗时nk,for循环耗时n方;

思路

首先定义一个n行26列的二维布尔数组,用于储存每个字符串是否出现过,如果出现则赋值为true,最后再遍历一遍,如果都不相同,则将他们的字符串数量相乘,最后返回最大值;
Last modification:October 22nd, 2022 at 11:15 am
如果觉得我的文章对你有用,请随意赞赏