anagrams两种解法 用map来优化查找
来源:互联网 发布:淘宝详情页是什么 编辑:程序博客网 时间:2024/04/30 20:52
下面的解法比较纠结,是开了一个大空间,把是 anagrams的都存在一个key下,key是排序后的string ,value为anagrams的所有字符串,如果要求输出的不只是一类anagrams的时候这种方法更好。题目做了简化没有要求输入空格的单词和字符,而且只要输出一种anagram,要知道一组字符串可能存在好多组anagram
#include <iostream>#include <vector>#include <string>#include <algorithm>#include <map>using namespace std;/**Given an array of strings, return all groups of strings that are anagrams.Note: All inputs will be in lower-case.Anagram(回文构词法)是指打乱字母顺序从而得到新的单词,比如 "dormitory" 打乱字母顺序会变成 "dirty room" , "tea" 会变成"eat"。回文构词法有一个特点:单词里的字母的种类和数目没有改变,只是改变了字母的排列顺序。因此,将几个单词按照字母顺序排序后,若它们相等,则它们属于同一组 anagrams 。关键是用map 优化查找空格如何处理??会自动删去?题目的限定是这一组字符串中,只有一类anagrams也就是说不会出现{“tea”,“eat”}和{"dirty room","dormitory"}两行返回值否则返回的应该是二维的vectorvector<string>表示的只是string数组*/class Solution {public: vector<string> anagrams(vector<string> &strs) { map<string,vector<string> > str; //key 为排序后的串 ,value为anagram的串 for(int i=0;i<strs.size();i++){ string tmp = strs[i]; sort(tmp.begin(),tmp.end()); str[tmp].push_back(strs[i]); } //相同的元素已经存在了同一个key string的value里 map<string, vector<string> >::iterator it; //注意只有迭代器才可以取出map的value元素 vector<string> re; for(it = str.begin();it != str.end() ;it++ ) //这个迭代器扫描的是str的key(格式为string),相当与做每行扫描,str为关键串相同的N行串数组 if( it->second.size() > 1){ //相当于每行的内容扫描,内容为串数组,扫描并加入结果中。 for(int i = 0; i < it->second.size(); ++i) re.push_back(it->second[i]); //it->second 是个数组,所以可以用second[i]来表示字符串 } return re; }};int main(){ vector<string> strs ; strs.push_back("eat"); strs.push_back("tea"); strs.push_back("dormitory"); strs.push_back("dirty room"); strs.push_back("apple"); strs.push_back("me"); Solution sol; vector<string> re = sol.anagrams(strs); for(int i = 0;i < re.size();i++) cout << re[i] <<" " << endl; return 0;}
另一种解法,其实就是把上面每个情况都存入改成了只查找标记出value>1 也就是存在anagrams的字符串,再一次循环找这些string,一个个添加到结果里。
class Solution {public: vector<string> anagrams(vector<string> &strs) { map<string,int> tmp; for(int i =0 ;i < strs.size();i++){ string s = strs[i]; sort(s.begin(),s.end()); if(tmp.find(s) == tmp.end()) tmp[s] = 1;//当找不到这个元素,则置入1,否则 元素的value自加1 else tmp[s]++; } vector<string > re; for(int i =0 ;i < strs.size();i++){ string s = strs[i]; sort(s.begin(),s.end()); if(tmp[s] > 1) re.push_back(strs[i]); } return re; }};
0 0
- anagrams两种解法 用map来优化查找
- Leetcode Group Anagrams两种解法
- 优化map查找操作
- 约瑟夫问题--两种解法
- hdu1597的两种解法
- hdu 3342 两种解法
- LeetCode Candy 两种解法
- LA 3218 两种解法
- LIS 两种复杂度解法
- TopK的两种解法
- Group Anagrams问题及解法
- Sereja ans Anagrams(map)
- Leetcode 133. Clone Graph用BFS、DFS两种解法
- [poj 1742]Coins多重背包优化解法两则
- 从减少DNS查找来优化网站
- N种皇后的两种解法
- OJ---不可摸数,两种解法
- 八皇后问题的两种解法
- Jvm gc collectors
- 8086汇编杂记
- 小珂的游戏
- JAVA设计模式之策略模式
- 南邮-2047(地铁换线)
- anagrams两种解法 用map来优化查找
- 实验二
- Js各种继承方法总结
- poj3264
- quick-cocos2d-x3.2 scheduler使用注意事项
- 领会
- 主页导航设计
- Fedora20 kermit串口工具
- C语言上机