列表

详情


771. 宝石与石头

 给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。

字母区分大小写,因此 "a""A" 是不同类型的石头。

 

示例 1:

输入:jewels = "aA", stones = "aAAbbbb"
输出:3

示例 2:

输入:jewels = "z", stones = "ZZ"
输出:0

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int numJewelsInStones(string jewels, string stones) { } };

golang 解法, 执行用时: 0 ms, 内存消耗: 1.9 MB, 提交时间: 2023-07-24 09:08:28

func numJewelsInStones(jewels, stones string) (ans int) {
    // 把 jewels 转换成字符集合 mask
    mask := 0
    for _, c := range jewels {
        mask |= 1 << (c & 63)
    }
    // 统计有多少 stones[i] 在集合 mask 中
    for _, c := range stones {
        ans += mask >> (c & 63) & 1
    }
    return
}

java 解法, 执行用时: 0 ms, 内存消耗: 39.8 MB, 提交时间: 2023-07-24 09:08:13

class Solution {
    public int numJewelsInStones(String jewels, String stones) {
        // 把 jewels 转换成字符集合 mask
        long mask = 0;
        for (char c : jewels.toCharArray())
            mask |= 1L << (c & 63);
        // 统计有多少 stones[i] 在集合 mask 中
        int ans = 0;
        for (char c : stones.toCharArray())
            ans += mask >> (c & 63) & 1;
        return ans;
    }
}

python3 解法, 执行用时: 52 ms, 内存消耗: 15.9 MB, 提交时间: 2023-07-24 09:07:57

# 位运算
class Solution:
    def numJewelsInStones(self, jewels: str, stones: str) -> int:
        # 把 jewels 转换成字符集合 mask
        mask = 0
        for c in jewels:
            mask |= 1 << (ord(c) & 63)
        # 统计有多少 stones[i] 在集合 mask 中
        return sum(mask >> (ord(c) & 63) & 1 for c in stones)

javascript 解法, 执行用时: 48 ms, 内存消耗: 41.5 MB, 提交时间: 2023-07-24 09:06:36

/**
 * @param {string} J
 * @param {string} S
 * @return {number}
 */
var numJewelsInStones = function(J, S) {
    const set = new Set();
    for(const s of J) {
        set.add(s);
    }
    let ans = 0;
    for(const s of S) {
        if(set.has(s)){
            ans++;
        }
    }
    return ans;
};

java 解法, 执行用时: 1 ms, 内存消耗: 40 MB, 提交时间: 2023-07-24 09:06:21

class Solution {
    public int numJewelsInStones(String J, String S) {
        Set<Character> set = new HashSet<>();
        for(int i = 0; i < J.length(); i++) {
            set.add(J.charAt(i));
        }
        int ans = 0;
        for(int i = 0; i < S.length(); i++) {
            if(set.contains(S.charAt(i))){
                ans++;
            }
        }
        return ans;
    }
}

golang 解法, 执行用时: 0 ms, 内存消耗: 2 MB, 提交时间: 2020-11-14 23:37:45

func numJewelsInStones(J string, S string) int {
    ans := 0
    for _, c := range J {
        ans += strings.Count(S, string(c))
    }
    return ans
}

python3 解法, 执行用时: 40 ms, 内存消耗: 13.6 MB, 提交时间: 2020-11-14 23:26:36

class Solution:
    def numJewelsInStones(self, J: str, S: str) -> int:
        return sum([S.count(c) for c in J])

上一题