查找常用字符

给定仅有小写字母组成的字符串数组  A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。
例如,如果一个字符在每个字符串中出现  3  次,但不是  4  次,则需要在最终答案中包含该字符  3  次。

你可以按任意顺序返回答案。

示例  1:
        输入:["bella","label","roller"]
        输出:["e","l","l"]
示例  2:
        输入:["cool","lock","cook"]
        输出:["c","o"]
提示:
        1  <=  A.length  <=  100
        1  <=  A[i].length  <=  100
        A[i][j]  是小写字母

自我解答

        需要找到公共字符的个数,如  示例2中,‘o’在3个字符串中的个数分别是  2,1,2,
        那公共字符个数是1,就是min(2,1,2),  这个“三维形体表面积计算”的思路是一样的,
        最小的那个就是公共字符串。
        使用  chmaps[{}]  记录每条字符串中字符个数,再统计chmaps中公共字符数就行了

class Solution2:
    def commonChars(self, A: List[str]) -> List[str]:
        chmaps = []
        for word in A:
            chmap = {}
            for ch in word:
                if ch not in chmap:
                    chmap[ch] = 1
                else:
                    chmap[ch] += 1
            chmaps.append(chmap)

        res = []
        for k, v in chmaps[0].items():
            k_num = min(v, *[chmap.get(k, 0) for chmap in chmaps[1:]])
            res.extend([k] * k_num)

        return res
题解

        题解中多是用计数法,类似计数排序的思路。把字母转换成  ASCII,  使用26长度的数组记录每个字母的个数。
        时间复杂度相同

class Solution4:
    def commonChars(self, A: List[str]) -> List[str]:
        chars_nums = []
        for word in A:
            temps = [0] * 26
            for ch in word:
                temps[ord(ch) - ord('a')] += 1
            chars_nums.append(temps)

        res = []
        for i in range(0, len(chars_nums[0])):
            if chars_nums[0][i]:
                knum = min(chars_nums[0][i], *[st[i] for st in chars_nums[1:]])
                res.extend([chr(i + ord('a'))] * knum)
        return res

原题链接:https://leetcode-cn.com/problems/find-common-characters