LeetCode算法题 (字母异位词分组)Day7!!!C/C++

https://leetcode.cn/problems/group-anagrams/description/

一、题目描述

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

二、示例分析

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

         通过上述题目描述以及这里的实例分析,我们可以发现,今天的题目要求通俗易懂的来说就是,将字母以及字母个数都一样的字符串组合到一起,并返回结果。

三、解题思路&代码实现

        其实今天这道题目本来也是想用C和大家分享的,但是打开一看,果断选择放弃C,选择C++。

这里都已经用到了三级指针,好不好写咱们先不说,就是写出来了,要理解起来还是很费劲的,相信大家对C有一定基础的小伙伴都知道指针的抽象程度。这里就不多提了,每道题目都有很多种的解题方法,而我们需要的就是多学习几门技能从而更简单、更高效的完成相应的功能。 所以说技多不压身啊!

        ok,废话不多说,这里首先分析一下,我们要怎么知道每个字串中的字符和个数都相等呢?

这里给大家分享一个思路,就是先用排序把每个字符串进行(大到小、小到大都可以)排序,这样只要他的字符和个数都相等,那么等排序完成后,他们就会是一样的。

        那么接下来就会又有一个新的问题,排序好了,那要怎么用呢?C++中有个容器叫做Map,(在这里简单让大家了解一下)

  • map中所有元素都是pair
  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
  • 所有元素都会根据元素的键值自动排序

我们可以将原始的字符串添加到以排序好的key中,如果下一个原始字符串并没有找到key那么就说明这是一个与之前所有字符串都不相同的字符串。

而我们今天要用到的恰恰就是哈希表,一种数据结构(关联map容器的使用)感兴趣的小伙伴可以自行搜索相关知识进行学习,这里我就不多提了。下面来看一下最终的实现代码吧

class Solution {
public:
    // 该函数用于将输入的字符串数组中所有字母异位词组合在一起
    // 参数strs是输入的字符串数组
    // 返回值是一个二维字符串数组,其中每个子数组包含的都是字母异位词
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        // 创建一个map,用于存储排序后的字符串(作为键)及其对应的字母异位词列表(作为值)
        // 键是排序后的字符串,值是包含所有具有相同字母组成的原始字符串的向量
        map<string, vector<string>> m;
        // 遍历输入的字符串数组strs
        for (int i = 0; i < strs.size(); i++) {
            // 取出当前字符串
            string data = strs[i];
            // 对当前字符串进行排序,这样所有字母异位词排序后会得到相同的字符串
            sort(data.begin(), data.end());
            // 将原始字符串strs[i]添加到以排序后字符串data为键的向量中
            // 如果键data不存在,会自动创建一个新的向量
            m[data].push_back(strs[i]);
        }
        // 创建一个二维向量ret,用于存储最终的分组结果
        vector<vector<string>> ret;
        // 遍历map中的每一个键值对
        for (map<string, vector<string>>::iterator it = m.begin();
             it!= m.end(); it++) {
            // 将每个键对应的值(即一个字母异位词组)添加到ret中
            ret.push_back(it->second);
        }

        // 返回分组后的结果
        return ret;
    }
};

四、题目总结

  1. 首先使用 map 来存储排序后的字符串和其对应的原始字母异位词列表。
  2. 通过遍历输入的字符串数组,对每个字符串进行排序,然后将其原始形式添加到 map 中对应的位置。
  3. 最后,遍历 map,将每个键对应的值(即字母异位词组)添加到最终的结果向量 ret 中并返回。

        今天我们成功地使用哈希表(或排序 + 映射)解决了 “字母异位词分组” 这一 LeetCode 算法题,深入理解了哈希表在处理这类字符串分组问题中的强大作用,以及排序操作对于识别字母异位词的巧妙应用。每一次对算法的探索都是成长的积累,希望大家在后续的 LeetCode 刷题之旅中继续保持热情与专注,不断攻克难题,提升自己的编程技能与算法思维,向着算法高手的目标稳步迈进!期待下一次与大家在代码世界中相遇,共同解锁更多精彩的算法解法!谢谢大家!荆轲刺秦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值