[LeetCode] Anagrams
来源:互联网 发布:广州软件开发公司 编辑:程序博客网 时间:2024/05/22 05:09
Anagrams
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
解题思路:
anagrams(变位字)是指对于两个单词来说,长度相同,且构成的字符除了顺序可以不同外,个数都相同。如cinema和iceman就是变位字。
判断两个字符串(长度需要相同)是否为变位字的方法,可以先对一个字符串每种字符进行计数,然后遍历另外一个字符串,对相应的位作减操作。若其中某个字符的计数出现负数,则为非变位字,否则,他们互相为变位字。这种方法的时间复杂度为O(n)。但是每次都需要遍历这个字符串。按这种思路写的代码如下。产生超时。
class Solution {public: vector<string> anagrams(vector<string>& strs) { vector<string> result; int len = strs.size(); bool checked[len]; memset(checked, 0, len*sizeof(bool)); for(int i=0; i<len; i++){ if(checked[i]){ continue; } for(int j=i+1; j<len; j++){ if(isAnagrams(strs[i], strs[j])){ if(!checked[i]){ result.push_back(strs[i]); } checked[i]=checked[j]=true; result.push_back(strs[j]); } } } return result; } bool isAnagrams(string& s1, string& s2){ if(s1.length()!=s2.length()){ return false; } int letters[26]; memset(letters, 0, 26*sizeof(int)); for(int i=0; i<s1.length(); i++){ letters[s1[i]-'a']++; } for(int j=0; j<s2.length(); j++){ letters[s2[j]-'a']--; if(letters[s2[j]-'a']<0){ return false; } } return true; }};另外一种办法,判断两个字符串是否互为变位字,首先将他们排序,若排序后他们相同,那么他们就是变位字。虽然单独判断的时间复杂度为O(nlogn),但是这个信息能够重复利用。对于这道题就是如此。因此可以用一个hash表记录所有变位字。
class Solution {public: vector<string> anagrams(vector<string>& strs) { vector<string> result; map<string, vector<string>> codeToStrs; int len = strs.size(); for(int i=0; i<len; i++){ string code = getCode(strs[i]); codeToStrs[code].push_back(strs[i]); } for(map<string, vector<string>>::iterator it = codeToStrs.begin(); it!=codeToStrs.end(); it++){ if(it->second.size()<2){ continue; } result.insert(result.begin(), it->second.begin(), it->second.end()); } return result; } string getCode(string s){ std::sort(s.begin(), s.end()); return s; }};
0 0
- LeetCode: Anagrams
- LeetCode: Anagrams
- LeetCode Anagrams
- Leetcode: Anagrams
- [Leetcode] Anagrams
- LeetCode : Anagrams
- [leetcode] anagrams
- LeetCode Anagrams
- [LeetCode] Anagrams
- [LeetCode]Anagrams
- [leetcode]Anagrams
- leetcode anagrams
- [leetcode] Anagrams
- LeetCode-Anagrams
- LeetCode - Anagrams
- Leetcode: Anagrams
- 【Leetcode】Anagrams
- LeetCode Anagrams
- solr4.9之配置中文分词smartcn
- C单元测试框架——CMockery简介与示例
- java多线程系列----------- 终结任务(一)
- 书籍:wpf学习书籍介绍
- Java基础(极客)——16、Java开发调试技巧及Eclipse快捷键使用方法
- [LeetCode] Anagrams
- 摄像机指标
- poj 3041 Asteroids
- 第九周项目 2 职员有薪水了(2)
- linux学习笔记—帮助命令
- Hadoop实战-初级部分 之 MapReduce
- Thunderbird设置邮件回复时自动签名和邮件引用的位置
- 技巧之一:EditText中输入图像的处理方法(仿QQ聊天内容处理)
- hive常用函数