个人常用C++所以所用解法皆为C++
常用的哈希结构:
数组,set,map
三大set了解:
三大map了解:
leetcode原题:
1、字母异位词
题意:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
首先暴力解法,那么肯定是遍历一遍字符串s,得到字符串s中的字母后再遍历一次字符串t,两者进行比较,最终获得结果。
那么这样的话时间复杂度就是O(n^2)。
所以直接看更优解:数组解
因为字母有26个 所以我们定义一个装有26个int元素的数组来代表26个字母所对应的位置。
意思就是用a来对应下标0,b对应1,以此类推。
那么如此反复下去,我们只需要先遍历一次s字符串,将字符存储于数组中每个对应的下标位置,
再遍历一次t字符串,在对应的下标位置进行删除。最后遍历数组中各下标是否为0即可。
时间复杂度为O(n)。
class Solution {
public:
bool isAnagram(string s, string t)
{
int hash[26] = { 0 };
for (int i = 0; i < s.size(); i++)
{
hash[s[i] - 'a']++;
}
for (int i = 0; i < t.size(); i++)
{
hash[t[i] - 'a']--;
}
for (int i = 0; i < 26; i++)
{
if (hash[i] != 0)
{
return false;
}
}
return true;
}
};
2、数组交集
题意:
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
由题意可知,此处所求结果的元素需要不重复。那么此处若用set的话那么就需要用到set或者unordered_set
又因为unordered_set的查找效率优于set 所以此处我们使用unordered_set
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
{
unordered_set<int>s1;
unordered_set<int>res;
for (int i = 0; i < nums1.size(); ++i)
{
s1.insert(nums1[i]);
}
for (int i = 0; i < nums2.size(); ++i)
{
if (s1.find(nums2[i]) != s1.end())
{
res.insert(nums2[i]);
}
}
return vector<int>(res.begin(), res.end());
}
};