目录
1.242. 有效的字母异位词
2.349. 两个数组的交集 - 力扣(LeetCode)
使用算法笔记:
总结:
1.242. 有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
解法1:暴力排序:
我们可以建立两个multiset容器分别存储这两个字符串的ascell码值。由于multiset容器的排序性质,我们就可以对两个容器进行逐步对比,如果值不相同就报错:
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.size() != t.size()) {
return false;
}
multiset<char> s1(s.begin(), s.end());
multiset<char> t1(t.begin(), t.end());
return s1 == t1;
}
};
解法2:哈希表:
建立一个vector容器,我们用下标来反映字母,用值来反映字母出现的次数,那么我们先遍历s字符串 进行操作d3[s[i]-97]++;,此时vector容器中不同下标处就会有不同的值,然后我们再遍历t字符串 进行操作:d3[t[i]-97]--;,此时如果字符串s与字符串t是字母异位词,在s中加的值一定会在t中减去,遍历容器一定值都是0,反之则说明这两个不是字母异位词。
class Solution {
public:
bool isAnagram(string s, string t) {
auto a=s.size();
auto b=t.size();
if(a!=b)
{
return false;
}
vector<int>d3(26,0);
for(int i=0; i<a; i++)
{
d3[s[i]-97]++;
d3[t[i]-97]--;
}
for(int i=0;i<26;i++)
{
if(d3[i]!=0)
{
return false;
}
}
return true;
}
};
简化版本:
class Solution {
public:
bool isAnagram(string s, string t) { // 定义函数 isAnagram,入参为 s 和 t 两个字符串,返回值为布尔型,表示 s 和 t 是否为异位词
if (s.size() != t.size()) { // 如果 s 和 t 的长度不相等,那么它们一定不是异位词
return false; // 直接返回 false
}
unordered_map<char, int> freq; // 定义一个哈希表,统计 s 中各个字符出现的次数
for (char c : s) { // 遍历字符串 s 中的每一个字符
++freq[c]; // 将字符 c 对应的值加 1
}
for (char c : t) { // 遍历字符串 t 中的每一个字符
if (--freq[c] < 0) { // 对应字符的值减 1,如果减完后小于 0,说明 t 中出现了 s 中没有的字符,即不是异位词
return false; // 直接返回 false
}
}
return true; // 如果能够顺利通过上述两个循环,说明 s 和 t 是异位词,返回 true
}
};
2.349. 两个数组的交集 - 力扣(LeetCode)
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
1.调用STL算法中的交集算法:set_intersection 容器交集(这里不能通过力扣,因为力扣不要求结果去重,而我们的交集算法会自己去重,因此不能使用,在这里只是作为一种思路分享给大家,了解更多C++算法的便洁)
文章链接:C++ 常见集合算法_我是一盘牛肉的博客-CSDN博客
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
// 使用 set 容器进行去重
set<int> intersect_set;
set_intersection(nums1.begin(), nums1.end(), nums2.begin(), nums2.end(), inserter(intersect_set, intersect_set.begin()));
// 将 set 转换为 vector 并返回
vector<int> intersect_vec(intersect_set.begin(), intersect_set.end());
return intersect_vec;
}
};
使用算法笔记:
1.inserter是 STL 中的一个函数模板,其作用是将元素插入到容器的指定位置。
inserter接受两个参数:第一个参数是容器对象,第二个参数是要插入到容器中的位置迭代器。当元素插入到容器中时,它们会被插入到指定位置前面,也就是说,如果我们使用 inserter(c, c.end())
,那么元素就会被插入到容器的末尾。
2.back_inserter是另一个 STL 迭代器适配器,与 inserter
不同,它会使用 push_back
函数向容器的末尾插入元素。
在本例中,使用 back_inserter 类似 inserter
,我们需要将插入元素放入 set
容器中。但是,使用back_inserter可以更简洁地实现这个过程,而不需要指定插入位置的迭代器。
3.set_intersection是交集算法,会自动计算已经排序好的两个容器之间的交集。
总结:
c++为我们提供了大量已经内置好的算法模板以及函数模板,我们如果可以掌握这些模板,就可以更加高效和快速的解决算法问题。
感谢关注,本人会持续更新力扣解法。