题目
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。
示例 1:
输入: J = "aA", S = "aAAbbbb"
输出: 3
示例 2:
输入: J = "z", S = "ZZ"
输出: 0
思路:
方法一:可以直接使用暴力破解,套两层循环,外层循环 S ,内层循环 J ,只要 S 中的字符在 S 中出现的个数即为宝石的数量。
方法二:方法一中遍历 S 中的任一字符都要遍历一次 J 进行比对,时间复杂度较高,我们循环遍历字符串 J ,使用 map 存储 J 中的字符,然后遍历 S 判断字符是否在 map 中,如果在即时宝石的数量。
Go代码示例:
func numJewelsInStones(J string, S string) int {
jewels := map[byte]bool{}
counts := 0
for i := 0; i < len(J);i++ {
jewels[J[i]] = true
}
for i := 0; i < len(S); i++ {
if jewels[S[i]] {
counts++
}
}
return counts
}
复杂度分析
-
时间复杂度:O(m+n),其中 m 为 J 的长度,n 为 S 的长度。
-
空间复杂度:O(m)