題目:Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case.
解析:anagram 表示由顛倒字母順序而構成的單詞。屬于 anagram 的兩個字符串雖然它們的字母順序不同,但是將它們按字母排序后應該相等,否則這兩個字符串就不屬于 anagram 了
代碼的思想及編寫參考了網址https://github.com/soulmachine/leetcode#leetcode題解題目
代碼如下:
// 時間復雜度 O(n),空間復雜度 O(n)class Solution {public: vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<vector<string>> result; unordered_map<string, vector<string>> mapping; for (int i = 0; i != strs.size(); ++i) { string key = strs[i]; sort(key.begin(), key.end()); mapping[key].push_back(strs[i]); } for (auto it1 = mapping.begin(); it1 != mapping.end(); ++it1) { result.push_back(it1 -> second); return result; }};附帶說明:判斷兩個字符串是否屬于 anagram的方法可以有幾種,比如上面說的排序,但排序的時間復雜度為 O(nlogn) (n 為字符串的長度),我們可以用哈希表使得時間復雜度為O(n),但空間復雜度也變成了O(n),代碼如下:
bool isAnagrams(string s1, string s2) { // 屬于anagram 的單詞的字母出現種類和次數應該是一樣的 // counts 表示字符串每個字符出現的字數 unordered_map<char, int> counts; for (int i = 0; i != s1.size(); ++i) ++counts[s1[i]]; for (int i = 0; i != s2.size(); ++i) if (counts.find(s2[i]) != s2.end()) --counts[s2[i]]; else return false; for (auto it = counts.begin(); it != counts.end(); ++it) if (it -> second != 0) return false; return true;*/}新聞熱點
疑難解答