---
# System prepended metadata

title: 318. Maximum Product of Word Lengths
tags: [string, Leetcode, bit, medium, python]

---

###### tags: `Leetcode` `medium` `bit` `string` `python`

# 318. Maximum Product of Word Lengths

## [題目連結:] https://leetcode.com/problems/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.
```

## 解題想法:
* 題目要求:找出兩個不包含重複字符的字串長度，求最大乘積
* 法(1):爆破法
    * 用set統計每個string出現字符種類
    * 雙for迴圈比較出現是否一樣
* 法(2):Bits判斷
    * 想法:
        * int有32bits，小寫英文字母有26個
        * 將每個字母對應到數字上
        * 讓每個string能有個對應的數字編號
        * 對於string中若有出現多個相同字母，一律只取一次，避免產生相同編號。
* 編號方式: 要用or
``` python=
#正確
string1 ='abca'
res=0
for char in string1:
    res |=1<<ord(char)-ord('a') 
print(res)
'''
a=0..... 1*(2**0)
b=1..... 1*(2**1)
c=2..... 1*(2**2)
a=0..... 1*(2**0)
要用or('|')才會避免取到兩次a
res= 1+2+4=7
'''
```
* 錯誤方式: 不能用累加，計算到重覆字母會導致整體字串編號不唯一  
```python=
#錯誤方式
string1 ='abca'
res=0
for char in string1:
    res +=1<<ord(char)-ord('a') 
print(res) # res1 = 8

string2='bcb'
res2=0
for char in string2:
    res2+=1<<ord(char)-ord('a')
print(res2)  # res2 = 8
```

## Python:
``` python=
class Solution(object):
    def maxProduct(self, words):
        """
        :type words: List[str]
        :rtype: int
        """
        n=len(words)
        nums=[0]*n
        res=0
        for pos,curString in enumerate(words):
            #編號
            for char in curString:
                #要用| :目的為能去除重複的字符，讓每個單字有唯一的對應數字
                nums[pos] |= 1<<(ord(char)-ord('a'))
        #比較
        for i in range(n):
            for j in range(i+1,n):
                #若沒交集: &會等於0，但進入if條件須為True(1) 所以加上not
                if not (nums[i]&nums[j]):
                    res=max(res,len(words[i])*len(words[j]))
        return res

if __name__=='__main__':
    result=Solution()
    ans=result.maxProduct(words = ["abcw","baz","foo","bar","xtfn","abcdef"])
    print(ans) #16
    
```