力扣第三天 242.有效字母异位词 349 两个数组的交集

目录

1.242. 有效的字母异位词

2.349. 两个数组的交集 - 力扣(LeetCode)​​​​​​

使用算法笔记:

总结:


1.242. 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

力扣第三天 242.有效字母异位词 349 两个数组的交集_第1张图片

 解法1:暴力排序:
我们可以建立两个multiset容器分别存储这两个字符串的ascell码值。由于multiset容器的排序性质,我们就可以对两个容器进行逐步对比,如果值不相同就报错:

class Solution {
public:
    bool isAnagram(string s, string t) {
        if (s.size() != t.size()) {
            return false;
        }
        multiset s1(s.begin(), s.end()); 
        multiset 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;
       }
       vectord3(26,0);
      for(int i=0; i

简化版本:

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 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 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

力扣第三天 242.有效字母异位词 349 两个数组的交集_第2张图片

 1.调用STL算法中的交集算法:set_intersection  容器交集(这里不能通过力扣,因为力扣不要求结果去重,而我们的交集算法会自己去重,因此不能使用,在这里只是作为一种思路分享给大家,了解更多C++算法的便洁)

文章链接:C++ 常见集合算法_我是一盘牛肉的博客-CSDN博客

class Solution {
public:
    vector intersection(vector& nums1, vector& nums2) {
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());

        // 使用 set 容器进行去重
        set intersect_set;
        set_intersection(nums1.begin(), nums1.end(), nums2.begin(), nums2.end(), inserter(intersect_set, intersect_set.begin()));

        // 将 set 转换为 vector 并返回
        vector 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++为我们提供了大量已经内置好的算法模板以及函数模板,我们如果可以掌握这些模板,就可以更加高效和快速的解决算法问题。

感谢关注,本人会持续更新力扣解法。
 

你可能感兴趣的:(leetcode,c++,算法,哈希表)