leetcode笔记:Maximum Product of Word Lengths

一. 题目描述

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0.

Example 1:

Given ["abcw", "baz", "foo", "bar", "xtfn", "abcdef"]

Return 16

The two words can be "abcw", "xtfn".

Example 2:

Given ["a", "ab", "abc", "d", "cd", "bcd", "abcd"]

Return 4

The two words can be "ab", "cd".

Example 3:

Given ["a", "aa", "aaa", "aaaa"]

Return 0

No such pair of words.

二. 题目分析

题目大意:给定一个字符串数组words,寻找length(words[i]) * length(words[j])的最大值,其中words[i]words[j] 两个单词不包含相同的字母。你可以假设每一个单词只包含小写字母。如果不存在这样的两个单词,结果返回0。

对于题目的要求,首先需要统计words中每个单词的小写字母a-z是否存在,然后一次枚举words[i]words[j],找出最大长度maxLength

这里可以使用32位整数来表示每个单词的字母存在情况。我们知道小写字母a~z有26位,因此一个32位整数的低26位可以用于标记a~z各个字母是否出现,比如最低位标记‘a‘是否出现;第二位标记‘b‘是否出现…以此类推,以下给出两个例子:

对于abcd,可被标记为:0000 0000 0000 0000 0000 0000 0000 1111

对于acxy,可被标记为:0000 0001 1000 0000 0000 0000 0000 0101

因此,只需申请一个int srtToBit[26]的数组,通过简单的位操作即可完成字符串标记。

标记完成后,开始两两比较数组,如"abcd"被标记为:0000 0000 0000 0000 0000 0000 0000 1111"wxyz"被标记为:1111 0000 0000 0000 0000 0000 0000 0000,由于两字符串不含相同的字母,因此两个整数值相与(&),结果必然为0,这样,就找出了这样的字符串对。

三. 示例代码

class Solution {
public:
    int maxProduct(vector<string>& words) {
        int SIZE = words.size();
        vector<int> strToBit(SIZE);
        // 将各字符串转换为32位整数,用各位上的状态
        // 0 & 1 来表示是否出现对应的字母,如acxyz为
        // 1010 0000 0000 0000 0000 0000 0000 0111
        // 32为整数存放在数组strToBit中
        for (int i = 0; i < SIZE; ++i)
        {
            int temp = 0;
            for (int j = 0; j < words[i].size(); ++j)
            {
                temp |= (1 << (‘x‘ - words[i][j]));

            }
            strToBit[i] = temp;
        }
        int maxLength = 0;
        // 分别对各字符串进行与运算
        for (int i = 0; i < SIZE - 1; ++i)
            for (int j = i + 1; j < SIZE; ++j)
                if ((strToBit[i] & strToBit[j]) == 0)
                    maxLength = max(maxLength, static_cast<int>(words[i].size() * words[j].size()));

        return maxLength;
    }
};

四. 小结

实现该题目的方法有很多,使用位运算是比较高效和精妙的方法。

时间: 2024-11-10 22:18:09

leetcode笔记:Maximum Product of Word Lengths的相关文章

leetcode 318: Maximum Product of Word Lengths

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0. Example

【leetcode】Maximum Product of Word Lengths

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0. Example

Leetcode 318 Maximum Product of Word Lengths 字符串处理+位运算

先介绍下本题的题意: 在一个字符串组成的数组words中,找出max{Length(words[i]) * Length(words[j]) },其中words[i]和words[j]中没有相同的字母,在这里字符串由小写字母a-z组成的. 对于这道题目我们统计下words[i]的小写字母a-z是否存在,然后枚举words[i]和words[j],找出max{Length(words[i]) * Length(words[j]) }. 小写字母a-z是26位,一般统计是否存在我们要申请一个bool

Maximum Product of Word Lengths

Maximum Product of Word Lengths Total Accepted: 750 Total Submissions: 2060 Difficulty: Medium Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume tha

Maximum Product of Word Lengths -- LeetCode

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0. Example

318. Maximum Product of Word Lengths

题目: Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0. Exa

318. Maximum Product of Word Lengths ——本质:英文单词中字符是否出现可以用26bit的整数表示

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0. Example

318. Maximum Product of Word Lengths java solutions

Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0. Example

318 Maximum Product of Word Lengths 最大单词长度乘积

给定一个字符串数组words,找到length(word[i]) * length(word[j])的最大值,并且两个单词不含公共的字母.你可以认为每个单词只包含小写字母.如果不存在这样的两个单词,返回 0.示例 1:输入 ["abcw", "baz", "foo", "bar", "xtfn", "abcdef"]返回 16两个单词可以为 "abcw", "