【LeetCode】Anagrams
来源:互联网 发布:御坂网络竞技 编辑:程序博客网 时间:2024/06/04 20:38
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
题目的意思是给一个String数组,找出其中由相同字母组成的单词。
例如:
S = ["abc", "bca", "bac", "bbb", "bbca", "abcb"]
答案为:
["abc", "bca", "bac", "bbca", "abcb"]
只有"bbb"没有相同字母组成的单词。
首先简单介绍一下Anagram(回文构词法)。Anagrams是指由颠倒字母顺序组成的单词,比如“dormitory”颠倒字母顺序会变成“dirty room”,“tea”会变成“eat”。
回文构词法有一个特点:单词里的字母的种类和数目没有改变,只是改变了字母的排列顺序。
由此我们可以想到,只要将几个单词按照字母顺序进行排序,就可以通过比较判断他们是否是anagrams。
思路:http://www.cnblogs.com/AnnieKim/archive/2013/04/25/3041982.html
用map<string, int>记录排序后的字符串以及首次出现的位置:
1. 从strs的第一个元素开始遍历,首先对元素进行排序得到s;
2. 在map里查找s;
3. 若不存在,将s以及该元素的下标存入map<string ,int>;
4. 若存在,首先将第一次出现s时的原始字符串存入结果res,即strs[map[s]],并将map[s]设置为-1(防止下次再存),再将该字符串本身存入结果res;
5. 重复以上1-4步,直到遍历结束。
具体代码如下:
class Solution { public: vector<string> anagrams(vector<string> &strs) { vector<string> ret; map<string, int> tmp; string stmp; for(int i=0;i<strs.size();i++){ stmp = strs[i]; sort(stmp.begin(),stmp.end()); if(tmp.find(stmp) == tmp.end()){ tmp[stmp] = i; }else{ if(tmp[stmp]>=0){ //存入之前的串 ret.push_back(strs[tmp[stmp]]); tmp[stmp] = -1; } ret.push_back(strs[i]); } } return ret; } };
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
- khvkhkj
- php学习笔记6--php中的正则表达式函数
- Python解释执行原理
- Android开发之XML文件的解析的三种方法
- 将cocos2dx导入Android工程
- 【LeetCode】Anagrams
- svn 无法提交,报错Solve ""svn : Working copy is too old (format 10, created by Subversion 1.6)
- 的体会现如今
- 发帖就如同看
- 的天天日益
- 推翻他哟
- 奥修:头脑的游戏
- afnetworking
- Android AsyncTask 分析内部实现