[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.

分析:使用位操作,让字符 'a' 位于最低位(第1位),字符 'b' 位于第2位,...,字符 'z' 位于第26位,

比如:

"a"     ->  1

"ab"    ->  11

"c"     ->  100

"dc"    ->  1100

"abcd"  ->  1111

实现这个操作的代码为:

        int val = 0;
        String str = "ad";
        for(char ch : str.toCharArray()) {
            val |= (1 << (ch - 'a'));
        }
        System.out.println(Integer.toBinaryString(val));

比如,str1进行上述操作后,变为val1;str2进行上述操作后,变为val2,这时如果要判断str1和str2是否含有相同的字母,只需执行:

(val1 & val2) == 0

如果结果为0,则不含有相同字母,反之,则含有。

综上所述,该题的代码如下:

    public int maxProduct(String[] words) {
        int max = 0;
        int[] bytes = new int[words.length];
        for(int i = 0; i < words.length; i++){
            int val = 0;
            for(char ch : words[i].toCharArray()) {
                val |= (1 << (ch - 'a'));
            }
            bytes[i] = val;
        }
        for(int i= 0; i < bytes.length; i++) {
            for(int j = i + 1; j < bytes.length; j++) {
                if((bytes[i] & bytes[j]) == 0) {
                    max = Math.max(max, words[i].length() * words[j].length());
                }
            }
        }
        return max;
    }

 

posted @ 2015-12-17 12:44  lasclocker  阅读(167)  评论(0编辑  收藏  举报