首先,回文构词法是指:字符种类数量相同,但出现在字符串中的顺序不同。
因此,两个字符串若为回文构词法,那么sort后结果一样。
如果sort后的字符串在整个数组中(每个字符串都sort后)只出现过一次,那么它不应该在结果集中,至少出现两次才应该加入结果集中。
因此可以使用一个map记录:键为sort后的字符串,值为原字符串第一次出现在数组中的位置。
这道题的做法是:
遍历一遍数组:
对于每个字符串进行sort,寻找map中是否存在这样的键:
若不存在,将该sort后的字符串与i存入map
若存在,且值为-1(用来记录是不是第二次出现这个值,因为第二次出现时,要把第一次出现的结果也加入结果集,若是第三次或四次出现,则不用将第一次的加入结果集),说明至少已经出现过两次,只将本次出现的字符串加入结果集即可
若存在, 且值不为-1,说明是第二次出现,则将第一次出现的字符串加入结果集、将本次出现的字符串加入结果集、并将map中该键的值设为-1
class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
map<string,int> m;
vector<string> res;
for(int i=0;i<strs.size();i++){
string temp = strs[i];
sort(temp.begin(),temp.end());
//map中还不存在键为temp的对儿
if(m.find(temp)==m.end()){
m[temp] = i;
}else{
//说明该字符串是回文构词法,且已出现过至少两次
if(m[temp]==-1){
res.push_back(strs[i]);
}
//说明该字符串是回文构词法,这是第二次出现,要把第一次出现的也加入结果集
else{
res.push_back(strs[m[temp]]);
res.push_back(strs[i]);
m[temp] = -1;
}
}
}
return res;
}
};