Description
Given an array of strings, return all groups of strings that are anagrams.
Example
Given ["lint", "intl", "inlt", "code"]
, return ["lint", "inlt", "intl"]
.
Given ["ab", "ba", "cd", "dc", "e"]
, return ["ab", "ba", "cd", "dc"]
.
What is Anagram?
- Two strings are anagram if they can be the same after change the order of characters.
Anagram就是字符串的字符顺序不同,只要注意到string也是可以排序的就简单了。
Solution
class Solution {
public:
/**
* @param strs: A list of strings
* @return: A list of strings
*/
vector<string> anagrams(vector<string> &strs) {
// write your code here
if(strs.size()==0 || strs.size()==1)
return strs;
//vector<string> newStrs;本想存排序后的每个str,实际可以不要
map<string,int> strsMap; //pais<string,int>('str',index)调序后字符串和索引
bool* flag = new bool[strs.size()];
for(int i=0;i<strs.size();i++)
flag[i] = false;
vector<string> resStrs;
for(int i=0;i<strs.size();i++){
string sortStr = strs[i];
sort(sortStr.begin(),sortStr.end()); //sort也可以处理string类型
map<string,int>::iterator it = strsMap.find(sortStr);
if(it!=strsMap.end()){
flag[it->second] = true; //map映射索引,能修改已存入map的上一个str的flag
flag[i] = true;
strsMap[sortStr] = i; //索引改成重复str的当前这个
}else{
strsMap[sortStr] = i; //不重复的str
}
}
for(int i=0;i<strs.size();i++){
if(flag[i])
resStrs.push_back(strs[i]);
}
return resStrs;
}
};