首页 > 学院 > 开发设计 > 正文

52:Anagrams

2019-11-06 08:51:05
字体:
来源:转载
供稿:网友

题目: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;*/}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表