class Solution:
def commonChars(self, words: List[str]) -> List[str]:
if not words : return []
result = []
hash = [0]*26
#记录数组中第一个字符串各字母出现频率
for i, c in enumerate(words[0]):
hash[ord(c)-ord('a')] += 1
#记录其它字符串字母出现频率,
for i in range(1,len(words)):
hashOtherString = [0]*26
for j, c in enumerate(words[i]):
hashOtherString[ord(c)-ord('a')] +=1
#每记完一个字符串,就将之与第一个字符串字母频率数组hash进行比较,每个字母取最小出现次数,即可得到至#此字符串位置的全局共用字符,后续还会继续更新,直至遍历完整个words
for k in range(26):
hash[k] = min(hash[k],hashOtherString[k])
#此时hash有全局最新的共用字符分布情况。遍历hash,用while将非0值一个一个映射为对应的字母并将其添加#到result数组中
for i in range(26):
while hash[i] != 0:
result.extend(chr(ord('a') + i))
hash[i] -= 1
return result
注:此算法的牛逼之处在于,将每个字符串的字母出现频率做一个比较,取其中最小的那个,即为该字母在所有字符串中的出现频率。底层逻辑为:如三个字符串中a出现的频率分别为3,2,1次。那么3包含了2和1,这种思想类似于取交集的思想。