[LeetCode]Anagrams
2015-05-23 14:28
197 查看
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
[LeetCode Source]
分析:所谓Anagrams指的是回文构词法。就是两个字符串所有的字符相同但是位置不同。比如”eat"和“tea"。
最开始我想通过一种构词方法,就是每个字母对应一个素数,这样可以计算每个字符串的特征值。
这是由于这样的数学性质:任何一个整数可以并且唯一表示成若干个素数的乘积。然后通过Map对应把string对应一个数。对大的string可能还有溢出的情况。
但是对于这一道题目不用如此麻烦。我们维护一个map表,把string的每个字母做排序后放进去,对应它的位置。然后如果在Map中找到该字符串,就说明发现了回文构词,把这两个词放入结果数组中。特别注意的是最早放进去的字符串的处理。
代码如下:
Note: All inputs will be in lower-case.
[LeetCode Source]
分析:所谓Anagrams指的是回文构词法。就是两个字符串所有的字符相同但是位置不同。比如”eat"和“tea"。
最开始我想通过一种构词方法,就是每个字母对应一个素数,这样可以计算每个字符串的特征值。
这是由于这样的数学性质:任何一个整数可以并且唯一表示成若干个素数的乘积。然后通过Map对应把string对应一个数。对大的string可能还有溢出的情况。
但是对于这一道题目不用如此麻烦。我们维护一个map表,把string的每个字母做排序后放进去,对应它的位置。然后如果在Map中找到该字符串,就说明发现了回文构词,把这两个词放入结果数组中。特别注意的是最早放进去的字符串的处理。
代码如下:
class Solution { public: vector<string> anagrams(vector<string>& strs) { vector<string> ret; map<string,int> Map; for(int i = 0;i<strs.size();++i){ string s = strs[i]; sort(s.begin(),s.end()); if(Map.find(s)==Map.end()){ Map[s]=i; } else{ if(Map[s]>=0){ //如果是第一次查找到 ret.push_back(strs[Map[s]]); Map[s]=-1; //避免重复放入 } ret.push_back(strs[i]); } } return ret; } };
相关文章推荐
- leetcode -- Group Anagrams -- 简单重点
- leetcode -- Anagrams
- LeetCode 49 Group Anagrams
- LeetCode - Anagrams
- LeetCode题解:Group Anagrams
- [Leetcode] 49. Group Anagrams 解题报告
- leetcode---anagrams---字符串
- Leetcode——438. Find All Anagrams in a String
- (LeetCode 49)Anagrams
- LeetCode49. Group Anagrams
- LeetCode Online Judge 题目C# 练习 - Anagrams
- LeetCode-49 Anagrams(返回字符相同的字符串)
- LeetCode - 49. Group Anagrams
- leetcode Group Anagrams
- [python]leetcode(49). Group Anagrams
- 【C++】【LeetCode】49. Group Anagrams
- LeetCode Group Anagrams
- LeetCode-Anagrams
- 【LeetCode】Anagrams
- LeetCode 49. Group Anagrams