开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
一、题目描述:
给你一个字符串 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)
范文参考:
通过哈希表计算出S中每一个字符出现的次数,再遍历J中的字符来查找是否在S的哈希表中出现,出现则把对应的值累加 - 宝石与石头 - 力扣(LeetCode)