leetcode Group Anagrams
2015-09-15 16:38
337 查看
Given an array of strings, group anagrams together.For example, given:
Return:
Note:
For the return value, each inner list's elements must follow the lexicographic order.
All inputs will be in lower-case.
解法:
Anagrams 即颠倒字符顺序生成的单词,abc bca 这样的就是,
所以聚集时可以先对str[i]字符排序,然后以该字符串hash映射,则每个key对应的应该是一个str数组,最后把hash中的字符列表输出即可
string getCode(string s){
sort(s.begin(),s.end());
return s;
}
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string> > results;
int size=strs.size();
if(size==0)
return results;
if(size==1){
results.push_back(strs);
return results;
}
map<string,vector<string> > head;
for(int i=0;i<size;++i){
head[getCode(strs[i])].push_back(strs[i]);
}
map<string,vector<string> >::iterator itor=head.begin(),end=head.end();
for(;itor!=end;++itor){
sort(itor->second.begin(),itor->second.end());
results.push_back(itor->second);
}
return results;
}
下边这段代码是我理解题意错误:刚开始不理解Anagrams的意思,以为是产生首位相接的各个list,
解法思想:
sort数组
对首字母建立map,注意,如果是空串,则特殊处理,在第一遍扫描时直接方法结果中
遍历map,在当前itor里,如果queue不为空,说明由以该字母开头的串,依次查找末尾字母开头的串,依次加入tempresult,直到没有以最后字母开头的串;
当前itor的queue为空 itor++;
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string> > results;
int size=strs.size();
if(size==0)
return results;
if(size==1){
results.push_back(strs);
return results;
}
sort(strs.begin(),strs.end());
vector<string> temp;
map<char,queue<int> > head;
for(int i=0;i<size;++i){
if(strs[i]=="")
{
temp.push_back(strs[i]);
}
else
head[strs[i][0]].push(i);
}
if(temp.size()>0)
results.push_back(temp);
temp.clear();
map<char,queue<int> >::iterator itor=head.begin(),end=head.end();
for(;itor!=end;){
if(itor->second.empty()){
++itor;
continue;
}
int i=itor->second.front();
itor->second.pop();
temp.push_back(strs[i]);
char ch=strs[i][0];
char chtail=strs[i].back();
while(head[chtail].empty()==false){
int pos=head[chtail].front();
head[chtail].pop();
temp.push_back(strs[pos]);
}
results.push_back(temp);
temp.clear();
}
return results;
}
["eat", "tea", "tan", "ate", "nat", "bat"],
Return:
[ ["ate", "eat","tea"], ["nat","tan"], ["bat"] ]
Note:
For the return value, each inner list's elements must follow the lexicographic order.
All inputs will be in lower-case.
解法:
Anagrams 即颠倒字符顺序生成的单词,abc bca 这样的就是,
所以聚集时可以先对str[i]字符排序,然后以该字符串hash映射,则每个key对应的应该是一个str数组,最后把hash中的字符列表输出即可
string getCode(string s){
sort(s.begin(),s.end());
return s;
}
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string> > results;
int size=strs.size();
if(size==0)
return results;
if(size==1){
results.push_back(strs);
return results;
}
map<string,vector<string> > head;
for(int i=0;i<size;++i){
head[getCode(strs[i])].push_back(strs[i]);
}
map<string,vector<string> >::iterator itor=head.begin(),end=head.end();
for(;itor!=end;++itor){
sort(itor->second.begin(),itor->second.end());
results.push_back(itor->second);
}
return results;
}
下边这段代码是我理解题意错误:刚开始不理解Anagrams的意思,以为是产生首位相接的各个list,
解法思想:
sort数组
对首字母建立map,注意,如果是空串,则特殊处理,在第一遍扫描时直接方法结果中
遍历map,在当前itor里,如果queue不为空,说明由以该字母开头的串,依次查找末尾字母开头的串,依次加入tempresult,直到没有以最后字母开头的串;
当前itor的queue为空 itor++;
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string> > results;
int size=strs.size();
if(size==0)
return results;
if(size==1){
results.push_back(strs);
return results;
}
sort(strs.begin(),strs.end());
vector<string> temp;
map<char,queue<int> > head;
for(int i=0;i<size;++i){
if(strs[i]=="")
{
temp.push_back(strs[i]);
}
else
head[strs[i][0]].push(i);
}
if(temp.size()>0)
results.push_back(temp);
temp.clear();
map<char,queue<int> >::iterator itor=head.begin(),end=head.end();
for(;itor!=end;){
if(itor->second.empty()){
++itor;
continue;
}
int i=itor->second.front();
itor->second.pop();
temp.push_back(strs[i]);
char ch=strs[i][0];
char chtail=strs[i].back();
while(head[chtail].empty()==false){
int pos=head[chtail].front();
head[chtail].pop();
temp.push_back(strs[pos]);
}
results.push_back(temp);
temp.clear();
}
return results;
}
相关文章推荐
- 15_09_15 ( ArithmeticException ) 算数异常
- 各种旋转表示方法
- Mipmap纹理技术
- Unix编程笔记疑问篇----如何从指令运行的角度去看待系统调用???
- HDU 3966 树链剖分 点权
- Oracle误删除数据恢复方法
- sqlserver新建job
- Android Data Binding初次使用
- iOS开发之 分段选择控件 开关 滑杆
- ListView嵌套GridView中的监听问题
- LINUX学习
- 我眼中的Android IDE
- 将A数据库的某个表的数据导入到B数据库的一张表中
- Scala中Zip相关的函数
- Python在Linux下的Tab补齐(附代码)
- video js Tracks
- LeetCode 258 : Add Digits
- AngularJS——1
- Struts 2 creating own interceptor
- NHibernate从入门到精通系列(6)——基本映射