Anagrams
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
题目:理解anagrams的意思,在给出的所有字符串中,如果串之间是anagrams,那么就返回。举个例子:输入act cat abc,输出为act cat。因为act和cat是anagrams。abc只出现一次不是。分析:anagrams的特点是,按字典序排序之后,都是一个值。利用这个特点,来进行计算。步骤如下:
- 定义一个map<string,int>,key是互不为anagrams的单词的字典序最小值,如bac对应的abc,int为该单词在strs中的下标或者-1,如果为-1表示该单词已经在res集合中。
- 对于字符串strs[i],排序tmp,判断tmp是否在map中。如果存在,说明是需要添加到res中的,此时要判断一下 对应的 int值如果不是-1,将对应下标的串加入res;如果是-1,结束。
代码:
class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
vector<string> res;
if(strs.size()<2) return res;
map<string, int> m;
for(int i=0;i<strs.size();i++){
string tmp=strs[i];
sort(tmp.begin(),tmp.end());//排序
map<string , int>::iterator it=m.find(tmp);
if(it!=m.end()){//在map中找到其字典序
if((*it).second !=-1){//判断bac经过sort后作为key,第二次cab时才是同时出现
res.push_back(strs[(*it).second]);
(*it).second=-1;
}
res.push_back(strs[i]);
}else{
//m.insert(pair<string,int>(tmp,i));
m[tmp]=i;//该单词所构成的anagram第一次出现,添加到map中
}
}
return res;
}
};