給定字符串數組,返回所有由互為字母異位詞(Anagrams)組成的分組。字母異位詞定義:兩字符串字母種類與個數完全相同。注意:單個字符串不構成分組,至少需要兩個。
將每個字符串排序後作為特徵值,互為字母異位詞的字符串排序結果相同。使用 map<string, int> 記錄特徵值首次出現的下標。
s。map 中是否存在 s:
map[s] = i(記錄首次出現位置)。map[s] >= 0,說明首次出現的原始字符串尚未加入結果,先加入 strs[map[s]],並將 map[s] = -1 標記已加入。strs[i] 到結果。class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
vector<string> res;
if (strs.size() <= 1) return res;
map<string, int> anagram; // 特徵值 -> 首次下標(-1 表示已加入結果)
for (int i = 0; i < strs.size(); i++) {
string s = strs[i];
sort(s.begin(), s.end());
if (anagram.find(s) == anagram.end()) {
anagram[s] = i;
} else {
if (anagram[s] >= 0) {
res.push_back(strs[anagram[s]]);
anagram[s] = -1;
}
res.push_back(strs[i]);
}
}
return res;
}
};
unordered_map 替代 map,查找平均 O(1)。輸入:["eat", "tea", "tan", "ate", "nat", "bat"]
排序特徵值:"aet", "aet", "ant", "aet", "ant", "abt"
輸出:["eat", "tea", "ate", "tan", "nat"]("bat" 無異位詞,不輸出)
本題核心在於「排序後的字符串作為特徵值」這一轉化,配合哈希表分組,是處理字母異位詞問題的通用模板。