0318. Maximum Product of Word Lengths - kumaeki/LeetCode GitHub Wiki

0318. Maximum Product of Word Lengths


Given a string array words, return the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. If no such two words exist, return 0.

Example 1:

Input: words = ["abcw","baz","foo","bar","xtfn","abcdef"]
Output: 16
Explanation: The two words can be "abcw", "xtfn".

Example 2:

Input: words = ["a","ab","abc","d","cd","bcd","abcd"]
Output: 4
Explanation: The two words can be "ab", "cd".

Example 3:

Input: words = ["a","aa","aaa","aaaa"]
Output: 0
Explanation: No such pair of words.

Constraints:

  • 2 <= words.length <= 1000
  • 1 <= words[i].length <= 1000
  • words[i] consists only of lowercase English letters.

解法1

用int二位数组memo来保存字符串数组的信息, 其中子数组长度为26,表示26个小写英文字母.

java

class Solution {
    public int maxProduct(String[] words) {
        int n = words.length, res = 0;
        // 二位数组, 保存words中每一个字符串中含有哪些字符
        int[][] memo = new int[n][26];
        for (int i = 0; i < n; i++) {
            int[] row = new int[26];
            // 只需要保存是否含有的信息就可以
            for (char c : words[i].toCharArray())
                row[c - 'a'] = 1;
            memo[i] = row;
        }

        for (int i = 0; i < n; i++) {
            int len1 = words[i].length();
            for (int j = i + 1; j < n; j++) {
                if (!hasSameChar(memo, i, j))
                    res = Math.max(res, len1 * words[j].length());
            }
        }
        return res;
    }

    // 判断words[i]和words[j]是否含有相同字符
    private boolean hasSameChar(int[][] memo, int i, int j) {
        int[] arr1 = memo[i], arr2 = memo[j];
        for (int k = 0; k < 26; k++)
            if (arr1[k] == 1 && arr2[k] == 1)
                return true;
        return false;
    }
}

C#

public class Solution {
    public int MaxProduct(string[] words) {
        var n = words.Length;
        var res = 0;
        // 二位数组, 保存words中每一个字符串中含有哪些字符
        var memo = new int[n,26];
        for (var i = 0; i < n; i++) 
            // 只需要保存是否含有的信息就可以
            foreach(var c in words[i].ToCharArray())
                memo[i, c - 'a'] = 1;

        for (var i = 0; i < n; i++) {
            var len1 = words[i].Length;
            for (var j = i + 1; j < n; j++) {
                if (!HasSameChar(memo, i, j))
                    res = Math.Max(res, len1 * words[j].Length);
            }
        }
        return res;
    }

    // 判断words[i]和words[j]是否含有相同字符
    private bool HasSameChar(int[,] memo, int i, int j) {
        for (var k = 0; k < 26; k++)
            if (memo[i, k] == 1 && memo[j, k] == 1)
                return true;
        return false;
    }
}

解法2

解法1用int[26]来保存字符串是否含有某个字符. 其实可以用int的二进制形式来保存.

java

class Solution {
    public int maxProduct(String[] words) {
        
        int n = words.length, res = 0;
        int[] memo = new int[n];
        for (int i = 0; i < n; i++) {
            int info = 0;
            // info的二进制形式,对应位置的1表示含有该字符
            // 是倒序保存
            for (char c : words[i].toCharArray())
                info = (info | (1<<(c - 'a')));
            memo[i] = info;
        }

        for (int i = 0; i < n; i++) {
            int len1 = words[i].length();
            for (int j = i + 1; j < n; j++) {
                if (!hasSameChar(memo, i, j))
                    res = Math.max(res, len1 * words[j].length());
            }
        }
        return res;
    }

    // 判断words[i]和words[j]是否含有相同字符
    private boolean hasSameChar(int[] memo, int i, int j) {
        return (memo[i]&memo[j]) > 0;
    }
}

C#

public class Solution {
    public int MaxProduct(String[] words) {
        var n = words.Length;
        var res = 0;
        var memo = new int[n];
        for (var i = 0; i < n; i++) {
            var info = 0;
            // info的二进制形式,对应位置的1表示含有该字符
            // 是倒序保存
            foreach (var c in words[i].ToCharArray())
                info = (info | (1<<(c - 'a')));
            memo[i] = info;
        }

        for (var i = 0; i < n; i++) {
            var len1 = words[i].Length;
            for (var j = i + 1; j < n; j++) {
                if (!HasSameChar(memo, i, j))
                    res = Math.Max(res, len1 * words[j].Length);
            }
        }
        return res;
    }

    // 判断words[i]和words[j]是否含有相同字符
    private bool HasSameChar(int[] memo, int i, int j) {
        return (memo[i] & memo[j]) > 0;
    }
}