Leetcode711. 宝石与石头

题目:宝石与石头
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J 中的字母不重复,JS中的所有字符都是字母。字母区分大小写,因此"a""A"是不同类型的石头。
示例 1:

输入: J = "aA", S = "aAAbbbb"
输出: 3

示例 2:

输入: J = "z", S = "ZZ"
输出: 0

注意:

  • SJ 最多含有50个字母。
  • J 中的字符不重复。

解题

class Solution(object):
    def numJewelsInStones(self, J, S):
        """
        :type J: str
        :type S: str
        :rtype: int
        审题:只有字母,区分大小写
        """

        if not S or not J: return 0
        res = 0

        # 1 暴力法:遍历S,在J中,就+1
        # TIME:O(len(S) * len(J), SPACE:O(1),28ms
        # 时间复杂度:O(mn),其中 m 是字符串 J 的长度,n 是字符串 S 的长度。遍历字符串 S 的时间复杂度是 O(n),对于 S 中的每个字符,需要遍历字符串 J 判断是否是宝石,时间复杂度是 O(m),因此总时间复杂度是 O(mn)。
        for i in S:
            if i in J:
                res += 1

        return res


        # 2 函数count()
        # time:O(J), SPACE:O(1),24ms
        for i in J:
            res += S.count(i)             # 

        return res


        # 3 字典
        # 时间复杂度:O(J.length + S.length)),O(J.length) 这部分来自于创建宝石字典,O(S.length)这部分来自于搜索 S
        # 空间复杂度:O(J.length),宝石字典长度

        # 生成宝石字典, J中字母不重复
        d = {
    
    }
        for i in J:
            d[i] = 1

        for j in S:
            if j in d:
                res += 1

        return res
    
        #  *************************和上面思想一致,多了个先转成list*************************
        d_J = {
    
    }
        J_list = list(J)
        for i in J:
            d_J[i] = 1
        
        res = 0
        S_list = list(S)
        for j in S_list:
            if j in d_J:
                res += 1
        
        return res

猜你喜欢

转载自blog.csdn.net/test121210/article/details/114238486