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;
}
};
四、题目总结
- 首先使用
map
来存储排序后的字符串和其对应的原始字母异位词列表。 - 通过遍历输入的字符串数组,对每个字符串进行排序,然后将其原始形式添加到
map
中对应的位置。 - 最后,遍历
map
,将每个键对应的值(即字母异位词组)添加到最终的结果向量ret
中并返回。
今天我们成功地使用哈希表(或排序 + 映射)解决了 “字母异位词分组” 这一 LeetCode 算法题,深入理解了哈希表在处理这类字符串分组问题中的强大作用,以及排序操作对于识别字母异位词的巧妙应用。每一次对算法的探索都是成长的积累,希望大家在后续的 LeetCode 刷题之旅中继续保持热情与专注,不断攻克难题,提升自己的编程技能与算法思维,向着算法高手的目标稳步迈进!期待下一次与大家在代码世界中相遇,共同解锁更多精彩的算法解法!谢谢大家!荆轲刺秦!