LeetCode49——Group Anagrams
2015-10-23 09:43
417 查看
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;
代码如下:
题意:
给定一组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; } };
相关文章推荐
- C#.NET常用的函数方法大全
- 开票的算法
- adb文件copy及sqlite3:not found篇
- usaco Hidden Password
- [OrangePi] If you are using an older image
- 激情的大三
- JVM的相关知识整理和学习
- Java基础增强3-反射,内省,beanutils,泛型
- iOS用户首选项NSUserDefaults浅析
- 彩色图像处理
- mysql 4种事务隔离级别
- c#与JavaScript实现对用户名、密码进行RSA非对称加密
- sql 截取字符串与 截取字符串最长的字符串
- 【PAT】1083. List Grades (25)
- 框架vs.类库
- Ubuntu linux 下查找文件或者内容常用命令
- swift可以不继承NSObject
- [转载] 为 Key-Value 数据库实现 MVCC 事务
- Python字符编码详解
- Android 三大图片缓存原理、特性对比