哈希表题目:宝石与石头
创始人
2024-03-20 10:30:52
0

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:宝石与石头

出处:771. 宝石与石头

难度

2 级

题目描述

要求

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

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

示例

示例 1:

输入:jewels="aA",stones="aAAbbbb"\texttt{jewels = "aA", stones = "aAAbbbb"}jewels = "aA", stones = "aAAbbbb"
输出:3\texttt{3}3

示例 2:

输入:jewels="z",stones="ZZ"\texttt{jewels = "z", stones = "ZZ"}jewels = "z", stones = "ZZ"
输出:0\texttt{0}0

数据范围

  • 1≤jewels.length,stones.length≤50\texttt{1} \le \texttt{jewels.length, stones.length} \le \texttt{50}1≤jewels.length, stones.length≤50
  • jewels\texttt{jewels}jewels 和 stones\texttt{stones}stones 仅由英语字母组成
  • jewels\texttt{jewels}jewels 中的所有字符都是唯一的

解法一

思路和算法

为了计算石头中有多少是宝石,需要判断每个石头是不是宝石,即判断字符串 stones\textit{stones}stones 中的每个字符是否在字符串 jewels\textit{jewels}jewels 中出现。

最直观的做法是,遍历 stones\textit{stones}stones 中的每个字符,对于每个字符,遍历 jewels\textit{jewels}jewels 中的每个字符,如果发现 jewels\textit{jewels}jewels 中存在一个字符和 stones\textit{stones}stones 的当前字符相同,则 stones\textit{stones}stones 的当前字符是宝石。遍历结束之后即可得到石头中有多少是宝石。

代码

class Solution {public int numJewelsInStones(String jewels, String stones) {int count = 0;int jewelsLength = jewels.length(), stonesLength = stones.length();for (int i = 0; i < stonesLength; i++) {char stone = stones.charAt(i);for (int j = 0; j < jewelsLength; j++) {if (stone == jewels.charAt(j)) {count++;break;}}}return count;}
}

复杂度分析

  • 时间复杂度:O(mn)O(mn)O(mn),其中 mmm 是字符串 jewels\textit{jewels}jewels 的长度,nnn 是字符串 stones\textit{stones}stones 的长度。需要遍历 nnn 个石头,对于每个石头,需要 O(m)O(m)O(m) 的时间判断该石头是不是宝石,因此总时间复杂度是 O(mn)O(mn)O(mn)。

  • 空间复杂度:O(1)O(1)O(1)。

解法二

思路和算法

解法一中,判断每个石头是不是宝石需要 O(m)O(m)O(m) 的时间。如果使用哈希集合存储宝石,则判断每个石头是不是宝石只需要判断该石头是否在哈希集合中,可以将时间复杂度从 O(m)O(m)O(m) 降低到 O(1)O(1)O(1)。

首先遍历 jewels\textit{jewels}jewels 中的每个字符并将字符加入哈希集合,然后遍历 stones\textit{stones}stones 中的每个字符,对于 stones\textit{stones}stones 中的每个字符,判断该字符是否在哈希集合中,即可知道该字符是不是宝石。遍历结束之后即可得到石头中有多少是宝石。

代码

class Solution {public int numJewelsInStones(String jewels, String stones) {int count = 0;Set jewelsSet = new HashSet();int jewelsLength = jewels.length(), stonesLength = stones.length();for (int i = 0; i < jewelsLength; i++) {jewelsSet.add(jewels.charAt(i));}for (int i = 0; i < stonesLength; i++) {if (jewelsSet.contains(stones.charAt(i))) {count++;}}return count;}
}

复杂度分析

  • 时间复杂度:O(m+n)O(m + n)O(m+n),其中 mmm 是字符串 jewels\textit{jewels}jewels 的长度,nnn 是字符串 stones\textit{stones}stones 的长度。首先遍历字符串 jewels\textit{jewels}jewels 并将 jewels\textit{jewels}jewels 的每个字符加入哈希集合,需要 O(m)O(m)O(m) 的时间,然后遍历字符串 stones\textit{stones}stones,对于字符串 stones\textit{stones}stones 中的每个字符需要 O(1)O(1)O(1) 的时间判断是不是宝石,共需要 O(n)O(n)O(n) 的时间计算有多少石头是宝石,因此总时间复杂度是 O(m+n)O(m + n)O(m+n)。

  • 空间复杂度:O(m)O(m)O(m),其中 mmm 是字符串 jewels\textit{jewels}jewels 的长度。需要使用哈希集合存储字符串 jewels\textit{jewels}jewels 中的全部字符,由于 jewels\textit{jewels}jewels 中的字符都不重复,因此哈希集合中的元素个数是 mmm。

相关内容

热门资讯

多部门协同调解基层纠纷 一场大雨落下,甘肃省甘南藏族自治州临潭县综治中心调解员朱培宏有些放心不下,早早来到城关镇居民周某家。...
股市必读:振江股份董冰因涉嫌违... 截至2025年7月25日收盘,振江股份(603507)报收于23.91元,下跌0.13%,换手率3....
山东泰山vs梅州客家:泰山狂射... 直播吧7月27日讯 中超第18轮,山东泰山3-0击败梅州客家。 全场数据如下↓
青岛疾控最新提醒:全民行动!翻... 近期,我国南方个别城市发生基孔肯雅热输入疫情并引发本地传播。基孔肯雅热是由基孔肯雅病毒引起的急性蚊媒...
俄罗斯宣布:取消阅兵式!普京:... 据央视新闻,当地时间7月27日,俄罗斯总统新闻秘书佩斯科夫在谈论关于原计划在圣彼得堡举行的海军节主阅...
国家税务总局明确一项政策执行口... 关于高速公路服务区占用耕地减征耕地占用税政策执行口径 时间:2025-07-07 问题描述:高速公路...
原创 统... 近期,据报道白宫发言人表示,特朗普政府可能在 8 月 1 日宣布更多贸易协议或寄出更多关税信。美国财...
皇马筹资签哈兰德?曼联对加纳乔... 转会市场的硝烟再度弥漫,2025年的夏季转会窗口堪称近年最具戏剧性的舞台,各大豪门的运筹帷幄,球员的...
当律师写诗:“万事都是热烈的烛... 深圳商报•读创客户端首席记者 魏沛娜 7月25日下午,“高树诗集《万事都是热烈的烛火》作品研讨会”在...
抢射建功!梅里诺社媒晒庆祝照:... 直播吧7月27日讯 阿森纳在今日新加坡举行的友谊赛3-2击败纽卡,梅里诺为球队扳平比分。 第32分钟...