力扣刷题记录#数组#简单1002查找常用字符

题目描述

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

示例

输入:[“bella”,“label”,“roller”]
输出:[“e”,“l”,“l”]

输入:[“cool”,“lock”,“cook”]
输出:[“c”,“o”]

解答

本来想拆解这个问题,先判断两个字符串的公共字符,因为整个字符串的公共字符必然也是这两个字符串的公共字符,所以再用这个公共字符和第三个字符串去找公共字符,以此类推。
这样可以找到公共字符,但是无法重复,不符合题目要求

class Solution(object):
    def commonChars(self, A):
        """
        :type A: List[str]
        :rtype: List[str]
        """
        
        length = len(A)
        
        ans = list()
            
        if length == 1:
            for i in range(0,len(A[0])):
                ans.append(A[0][i])
            return ans
        
        if length == 2:
            return self.sub_common_chars(A[0],A[1])
        
        common = self.sub_common_chars(A[0],A[1])
        for i in range(2,length):
            common = self.sub_common_chars(common,A[i])
            
        return list(common)
            
            
            
        
    def sub_common_chars(self,str1,str2):
        """
        输入两个字符串
        输出这两个字符串的公共字符,输出为字符串
        """
        # 统计字符串1内的字符和数量
        dict1 = dict()
        for a in str1:
            if a not in dict1.keys():
                dict1[a] = 0
            dict1[a] = dict1[a] + 1
                
        # 统计字符串2内的字符和数量
        dict2 = dict()
        for b in str2:
            if b not in dict2.keys():
                dict2[b] = 0
            dict2[b] = dict2[b] + 1
                
        common = str()   
        for a,count1 in dict1.items():
            if a in dict2.keys():
            common = common + a
            
        return common

参考评论区:

首先我们知道,所有的字符串都是由小写的英文字母组成的。
然后我们要找的是什么?
假设字母’a’在上面的字符串数组中的每个字符串中出现的次数为[a1, a2, a3…],其中最小值是min(a1, a2, a3…),那么我们最终返回的数组中应该包含min(a1, a2, a3…)个字母a。
同理,对于字母’b’,‘c’,'d’是一样的。
所以我们自要找到每个字母在每个字符串中出现的次数的最小值,就行了。
在示例1中,

  • ‘a’ 在每个字符串中出现的次数为[1,1,0],所以最终的结果中a出现的此物应该为0;
  • 'b’在每个字符串中出现的次数为[1,1,0],所以最终的结果中a出现的此物应该为0;
  • 'e’在每个字符串中出现的次数为[1,1,1],所以最终的结果中a出现的此物应该为1;
  • 'l’在每个字符串中出现的次数为[2,2,2],所以最终的结果中a出现的此物应该为2;

所以最终的结果中,e应该出现1次,l应该出现2次。然后就有了我们最终的结果[“e”,“l”,“l”]了。

作者:bitfishxyz
链接:https://leetcode-cn.com/problems/two-sum/solution/si-lu-xiang-xi-jie-xi-by-bitfishxyz/

class Solution(object):
    def commonChars(self, A):
        """
        :type A: List[str]
        :rtype: List[str]
        """
        
        common = list()
        
        letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n', \
                  'o','p','q','r','s','t','u','v','w','x','y','z']
        
        # 统计每个字符串中各个字母出现的次数
        # counts每行代表一个字母,每列代表一个字符串
        # counts的每行表示该字母在各个字符串中出现的次数
        counts = list()
        for i in range(0,26):
            counts.append([])
            letter = letters[i]
            
            for string in A:
                
                count = 0
                for char in string:
                    if char==letter:
                        count += 1
                        
                counts[i].append(count)
                
            min_count = min(counts[i])
            
            if min_count != 0:
                common = common + [letter]*min_count
                
        return common
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值