Leetcode Jewels and Stones 哈希表

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

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

示例 1:

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

示例 2:

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

注意:

  • S 和 J 最多含有50个字母。

  •  J 中的字符不重复。

这道题是哈希表的一道题,这里主要以这道题为例记录一下哈希表类题目的通用解法。

首先哈希表是<key,value>存储的键值对的集合,但是由于对于key的存储是用哈希函数计算而得并进行存储的,所以对key的查找是O(1),对key的查找效率极高,所以一般我们把关键词都放到key中。如果我们不是用stl封装的unsorted_map作为哈希map来解题的话,会自己定义一个数组a,然后把关键字转化成a的下标,即a[i]中的i,那么对a[i]做查找操作即取a[i]的值也是O(1)的时间复杂度,a的大小一般由需要多少个关键字来定。

在这道题中我们把J的每个字符对应到数组a的下标(每个字符即为我们说的关键字),把J的每个字符转化成数组a的下标对应的值,数组的值中1表示是宝石,0表示石头。具体如下:我们初始化长度为52(26个小写字母,26个大写字母)的数组a,初始化为0。然后遍历J字符串,其中A-Z对应数组下标0-25,a-z对应数组下标26-51。如果对应字符出现过则把对应的下标的值赋值为1。这样遍历一次J便可以把宝石对应的字符表示为1,石头默认为0。则同理在一次遍历S的时候,如果对应的字符的下标为1则代表宝石,全局变量res++,最后返回res即是答案。

c++代码如下:

    //是否是小写字母
    bool isLow(char* chr) {
	if ((*chr - 'A') >= 0 && (*chr - 'A') < 26) {
		return false;
	}
	return true;
    }
    //处理函数
    int numJewelsInStones(string J, string S) {
        	int strs[52] = { 0 };
	int J_length = J.size();
	int S_length = S.size();
	for (int i = 0; i < J_length; i++) {
		if (isLow(&J[i])) {
			strs[J[i] - 'a'] = 1;
		}
		else {
			strs[J[i] - 'A'+26] = 1;
		}
	}
	int res = 0;
	for (int j = 0; j < S_length; j++) {
		if (isLow(&S[j]) && strs[S[j]-'a']==1) {
			res++;
		}
		if (!isLow(&S[j]) && strs[S[j] - 'A'+26] == 1) {
			res++;
		}
	}
	return res;
    }
哈希表类的题目要不就使用封装好的hashmap,要不就构造一个数组来表示哈希表。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值