位運算 雜湊表 318 最大單詞長度乘積

2021-10-07 05:05:00 字數 1386 閱讀 9353

給定乙個字串陣列 words,找到 length(word[i]) * length(word[j]) 的最大值,並且這兩個單詞不含有公共字母。你可以認為每個單詞只包含小寫字母。如果不存在這樣的兩個單詞,返回 0。

示例 1:

輸入:

["abcw"

,"baz"

,"foo"

,"bar"

,"xtfn"

,"abcdef"

]輸出:

16

解釋: 這兩個單詞為 「abcw」, 「xtfn」。

示例 2:

輸入:

["a"

,"ab"

,"abc"

,"d"

,"cd"

,"bcd"

,"abcd"

]輸出:

4

解釋: 這兩個單詞為 「ab」, 「cd」。

示例 3:

輸入:

["a"

,"aa"

,"aaa"

,"aaaa"

]輸出:

0

解釋: 不存在這樣的兩個單詞。

解題

基本思路:兩兩比較,並判斷每兩個單詞之間是否有公共子字元,更新最大長度;

優化1:

判斷公共子字元:位運算

對每個字串計算掩碼,tmp|=1<<(ch-'a');得到的位為1則含有該字元;

判斷兩個字串是否有公共子字元掩碼1&掩碼2==0則無公共字元;

優化2:

事先計算每個字串的掩碼,儲存;

優化3:

建立map,儲存掩碼:該掩碼的最長字串;去除字元相同的短字串;

class

solution

if(map.

find

(tmp)

==map.

end(

)||map[tmp]

.length()

length()

) map[tmp]

=s;}

int len=0;

for(

auto t:map)

for(

auto f:map)

return len;

}private

: unordered_map<

int,string> map;

};

318 最大單詞長度乘積

給定乙個字串陣列 words,找到 length word i length word j 的最大值,並且這兩個單詞不含有公共字母。你可以認為每個單詞只包含小寫字母。如果不存在這樣的兩個單詞,返回 0。示例 1 輸入 abcw baz foo bar xtfn abcdef 輸出 16 解釋 這兩個...

leetcode 318 最大單詞長度乘積

給定乙個字串陣列words,找到length word i length word j 的最大值,並且這兩個單詞不含有公共字母。你可以認為每個單詞只包含小寫字母。如果不存在這樣的兩個單詞,返回 0。示例 1 輸入 abcw baz foo bar xtfn abcdef 輸出 16解釋 這兩個單詞為...

leetcode318 最大單詞長度乘積

給定乙個字串陣列words,找到length word i length word j 的最大值,並且這兩個單詞不含有公共字母。你可以認為每個單詞只包含小寫字母。如果不存在這樣的兩個單詞,返回 0。示例 1 輸入 abcw baz foo bar xtfn abcdef 輸出 16解釋 這兩個單詞為...