LeetCode49——Group Anagrams

本文详细解析 LeetCode49 题目 GroupAnagrams 的核心思路,通过构建 map 和 multiset 来区分并排序字符串,实现高效分类。深入理解排序、区分和字典序排列原理,掌握 C++ STL 库中的 set 和 multiset 的使用。
摘要由CSDN通过智能技术生成

LeetCode49——Group Anagrams

题意:

给定一组string,将这些string分类,同一类string满足如下条件:

1.在同类内部,按照字典序排列。

2.不同类的string所包含的字母不一样。

那么思路就是,首先区分,然后排序。


要做到区分很简单,首先对于不同类来说,他们包含的字母肯定不一样,那么将每个string进行排序(sort方法即可),就实现了string的区分,这里我们需要构造一个map来实现。


又如何对加入同一类别的子串进行字典序排列呢?

这里我们用到了STL中一个重要的容器multiset(注意不能使用set,具体在代码注释中说明)。

回顾一下set的特性:所有元素都会根据元素的键值自动被排序,set里面的元素键值(key)就是实值(value),set不允许有两个相同的key,所以此处我们使用multiset。

红黑树是一种平衡二叉树,自动排序效果很不错,所以set采用了红黑树为底层机制。

回到题目,基于上述理论,我们很容易想到,用set就可以完成同一类别string的字典序排列了。

因此,我们构建如下数据结构:

map <string ,  multiset<string> >myMap;

代码如下:

class Solution {
public:
	vector<vector<string>> groupAnagrams(vector<string>& strs) {
		map<string, multiset<string>>myMap;//用set不行,需要用multiset
		vector< vector<string> >result;
		for (int i = 0; i < strs.size(); i++)
		{
			string temp = strs[i];
			sort(temp.begin(), temp.end());
			myMap[temp].insert(strs[i]);
		}//构建map
		auto it = myMap.begin();
		while (it != myMap.end())
		{
			vector<string>temp(it->second.begin(), it->second.end());
			result.push_back(temp);
			++it;
		}
		return result;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值