問題の説明:
一緒に文字列配列、異所性の単語文字を考えます。異所性ワード文字が同じ文字を指しますが、別の文字列に配置されています。
例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
、
输出:
[
[、]、 "お茶を" "食べる" "食べた"
[]、 "NAT" "日焼け"、
[ "バット"]
]
説明:
- すべての入力は小文字です。
- 考慮されていなかった答えの順番。
基本的な考え方:
キーとして昇順で文字列。ベクトル型の値としてグループ化されます。
ACコード:
class Solution {
public:
string ChangeOrder(string str) {
// 返回字符升序排序的字符串
string res;
map<char, int> hashmap;
for (char ch : str) {
++hashmap[ch];
}
// 按照自然顺序遍历
for (char ch = 'a'; ch <= 'z'; ++ch) {
for (int i = 0; i < hashmap[ch]; ++i) {
res += ch;
}
}
return res;
}
vector<vector<string>> groupAnagrams(vector<string>& strs) {
map<string, vector<string>> hashmap;
for (string str : strs) {
hashmap[ChangeOrder(str)].push_back(str);
}
vector<vector<string>> res;
for (auto it = hashmap.begin(); it != hashmap.end(); ++it) {
res.push_back(it->second);
}
return res;
}
};
ダニエルさんのアイデア:
上記のコードは、私たちは、文字列のコピーを渡すために、非常に長い時間を費やしました。
むしろハッシュマップに格納されているすべての結果は、その後、ベクトルに結果を一つずつコピーします。
直接操作ベクトルとして。ハッシュマップは、当社のベクトル関連した情報に格納されます。
(ここで、ベクターに格納されている行の数です)
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string,int>index;
vector<vector<string>> result;
for(auto i:strs)
{
//sort(i.begin();i.end());
string tmp = i;
sort(tmp.begin(),tmp.end());
if(index.find(tmp)==index.end())
{
index.insert({tmp,(int)result.size()});
result.push_back(vector<string>{i});
}
else
{
result[index[tmp]].push_back(i);
}
}
return result;
}
};
その他の経験:
- 直接にあなたは望むかもしれ返された結果セットで動作するので、あなたはスペースの無駄のコピーを作成するとき。
- 私は、各文字列のソートソートカウンティング使用して実際には、我々は、メソッドをソート使用し、より効率的になります。
- 私たちは、ここでグループにハッシュマップを使用することができます鍵は私たちのグループをマークすることです。値は、グループメンバーの集合です。