本人转码小白,刚刚学习到哈希表。欢迎各位大佬批评指正。
算法思想来自博客代码随想录。(不是打广告啊,自学实在需要一些参考)
浅聊一下哈希表:
哈希表:又叫散列表,用来快速判断一个元素是否出现在集合里。(数组就是一个哈希表)
哈希函数:将一个某个数据成员,映射成一个数,并将其放在哈希表中。
举个人话的例子:
水果店里苹果单价2.5元,香蕉单价3.1元,菠萝...,如何快速查到某种水果的单价?这时需要用到哈希函数。
先用哈希函数进行映射:
然后,放到一个哈希表(数组)中,over。
方法比较:
传统找单价方法:输入苹果,遍历所有水果,找到苹果,输出2.5. O(n)
哈希方法:输入苹果,输出映射001,找到001索引对应的2.5。 O(1)
哈希碰撞:学到了再聊....
1.题目描述:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
字母异位词:每个字符出现字数相同。比如s = "aee" ,t = "eae"
2.题解思路:
1.定义一个长度为26的数组(哈希表)
2.把字符串中的'a','b','c'...'z'分别映射到0,1,2....25。(即数组的索引上)
3.s中的字母每出现一次,数组索引对应的值加1。
t中的字母每出现一次,数组索引对应的值减1。
4.遍历结束后,如果数组中的元素全是0,证明s和t为字母异位词。
举例子:假设 s = "aee" ,t = "eae"
3.本地实现
#include
#include
using namespace std;
class Solution
{
public:
bool isAnagram(string s, string t)
{
int hash[26] = { 0 };//创建一个长度为26的,全是0的数组,作为哈希表
//遍历s,把字母a、b、c....转化成数字0、1、2.....。哈希函数的思想
for (int i = 0; i < s.size(); i++)
{
hash[s[i] - 'a']++; //一种映射方法,保证'a'对应的是0。每出现一次,增加1
}
//遍历t
for (int i = 0; i < t.size(); i++)
{
hash[t[i] - 'a']--; //每出现一次,减少1
}
//遍历一边hash表,如果全是0,两字符串为字母异位
for (int i = 0; i < (sizeof(hash) / sizeof(hash[0])); i++)
{
if (hash[i] != 0) return false;//一旦表内有不为1,返回false
}
return true;//表内全是0,返回true
}
};
int main()
{
string s = "abc",t = "bca";
Solution solution;
cout << solution.isAnagram(s, t) << endl;
system("pause");
return 0;
}
码字不易,谢谢访问。



