算法学习771. 宝石与石头(java / c / c++ / python / go / rust)

Posted 二当家的白帽子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法学习771. 宝石与石头(java / c / c++ / python / go / rust)相关的知识,希望对你有一定的参考价值。

非常感谢你阅读本文~
欢迎【👍点赞】【⭐收藏】【📝评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子 https://le-yi.blog.csdn.net/ 博客原创~



771. 宝石与石头:

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

J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。

样例 1

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

样例 2

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

限制

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

分析

  • 常规做法直接双循环就可以了,循环次数就是S的长度乘以J的长度。
  • 可以先将S放入哈希表,这样在循环J的时候从哈希表查找要比循环S性能更好。
  • 由于宝石种类使用字母表示,所以我们预先知道宝石种类上限,这样可以用数组替代哈希表,性能可以更好。

题解

java

class Solution {
    public int numJewelsInStones(String jewels, String stones) {
        // 创建一个宝石对照表
        boolean[] table = new boolean[128];
        int jewelsLen = jewels.length();
        for (int i = 0; i < jewelsLen; ++i) {
            table[jewels.charAt(i)] = true;
        }

        // 统计宝石数量
        int count = 0;
        int stonesLen = stones.length();
        for (int i = 0; i < stonesLen; ++i) {
            if (table[stones.charAt(i)]) {
                count++;
            }
        }

        return count;
    }
}

c

int numJewelsInStones(char * jewels, char * stones){
    // 创建一个宝石对照表
    bool table[128];
    memset(table, false, 128);
    int jewelsLen = strlen(jewels);
    for (int i = 0; i < jewelsLen; ++i) {
        table[jewels[i]] = true;
    }

    // 统计宝石数量
    int count = 0;
    int stonesLen = strlen(stones);
    for (int i = 0; i < stonesLen; ++i) {
        if (table[stones[i]]) {
            count++;
        }
    }

    return count;
}

c++

class Solution {
public:
    int numJewelsInStones(string jewels, string stones) {
        // 创建一个宝石对照表
        bool table[128];
        memset(table, false, 128);
        for (char c : jewels) {
            table[c] = true;
        }

        // 统计宝石数量
        int count = 0;
        for (char c : stones) {
            if (table[c]) {
                count++;
            }
        }

        return count;
    }
};

python

class Solution:
    def numJewelsInStones(self, jewels: str, stones: str) -> int:
        # 创建一个宝石对照表
        table = [False] * 128
        for c in jewels:
            table[ord(c)] = True
        # 统计宝石数量
        count = 0
        for c in stones:
            if table[ord(c)]:
                count += 1
        return count

go

func numJewelsInStones(jewels string, stones string) int {
    // 创建一个宝石对照表
	table := [128]bool{}
	for _, c := range jewels {
		table[c] = true
	}

	// 统计宝石数量
	count := 0
	for _, c := range stones {
		if table[c] {
			count++
		}
	}

	return count
}

rust

impl Solution {
    pub fn num_jewels_in_stones(jewels: String, stones: String) -> i32 {
        // 创建一个宝石对照表
        let mut table = vec![false;128];
        jewels.bytes().for_each(|c|{
            table[c as usize] = true;
        });

        // 统计宝石数量
        stones.bytes().filter(|c|{
            table[*c as usize]
        }).count() as i32
    }
}


原题传送门:https://leetcode-cn.com/problems/jewels-and-stones/


以上是关于算法学习771. 宝石与石头(java / c / c++ / python / go / rust)的主要内容,如果未能解决你的问题,请参考以下文章

771. 宝石与石头

771. 宝石与石头

771.宝石与石头

LeetCode771. 宝石与石头(C++)

leetcode771. 宝石与石头

算法千题案例每日LeetCode打卡——93.宝石与石头