leetcode算法771. 宝石与石头

123 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情

一、题目描述:

771. 宝石与石头

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

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

 

示例 1:

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

示例 2:

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

提示:

  • 1 <= jewels.length, stones.length <= 50
  • jewels 和 stones 仅由英文字母组成
  • jewels 中的所有字符都是 唯一的

二、思路分析:

最简单的思路,遍历石头,检查石头是不是宝石。 宝石存成char[],石头存成List,以便把已经判断为宝石的石头从石头中拿出,减少循环比较的次数。 同时别忘了在拿出宝石的同时下标前移一位。

三、AC 代码:

 public int NumJewelsInStones(string J, string S) {
        char[] charJ = J.ToCharArray();
        List<char> charS = S.ToList<char>();
        int result = 0;
        for (int i = 0; i < charJ.Count(); i++)
        {
            for (int j = 0; j < charS.Count(); j++)
            {
                if (charJ[i] == charS[j])
                {
                    result++;
                    charS.Remove(charS[j]);
                    j--;
                }
            }
        }
        return result;
    }

四、总结:

哈希法更优其实。

遍历目标字符串,同时判断字符串中的字符是否属于宝石字符串,是的花在数量上加1即可。时间复杂度度为o(n)

范文参考:

771. 宝石与石头 题解 - 力扣(LeetCode)

执行用时 : 0 ms , 在所有 C++ 提交中击败了 100.00% 的用户 内存消耗 : 6.1 MB , 在所有 C++ 提交中击败了 100.00% 的用户 - 宝石与石头 - 力扣(LeetCode)

通过哈希表计算出S中每一个字符出现的次数,再遍历J中的字符来查找是否在S的哈希表中出现,出现则把对应的值累加 - 宝石与石头 - 力扣(LeetCode)