[leetcode][hash] Anagrams
2015-06-30 15:46
162 查看
题目;
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
v1 76ms
v2 68ms
v3 40ms
每一个字母用一个质数代表,用单词中每个字符对应的质数相乘的积作为hash的key(这样查找时不需要比较单词的每一个字符,效率大大提高了),value的意义同上
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
v1 76ms
class Solution { public: //将单词按字母顺序排序后作为hash的key,字符串在strs中的下标组成的vector作为value vector<string> anagrams(vector<string>& strs) { vector<string> res; map<string, vector<int> > hashTable; for (int i = 0; i < strs.size(); ++i){ string s = strs[i]; sort(s.begin(), s.end()); map<string, vector<int> >::iterator iter = hashTable.find(s); if (iter != hashTable.end()){ (iter->second).push_back(i); } else{ vector<int> vTmp; vTmp.push_back(i); hashTable[s] = vTmp; } } for (map<string, vector<int> >::iterator iter = hashTable.begin(); iter != hashTable.end(); ++iter){ if ((iter->second).size() > 1){ for (int i = 0; i < (iter->second).size(); ++i){ res.push_back(strs[(iter->second)[i]]); } } } return res; } };
v2 68ms
class Solution { public: //将单词按字母顺序排序后作为hash的key,value等于排序后单词第一次出现大的下标,当第二次出现时value置为-1防止重复再结果中插入第一出现的单词 vector<string> anagrams(vector<string>& strs) { vector<string> res; map<string, int> hashTable; for (int i = 0; i < strs.size(); ++i){ string s = strs[i]; sort(s.begin(), s.end()); map<string,int>::iterator iter = hashTable.find(s); if (iter != hashTable.end()){ if (iter->second != -1){ res.push_back(strs[iter->second]); iter->second = -1; } res.push_back(strs[i]); } else{ hashTable[s] = i; } } return res; } };
v3 40ms
class Solution { public: const int alphabetList[26] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101 }; vector<string> anagrams(vector<string>& strs) { vector<string> res; map<long long, int> hashTable; for (int i = 0; i < strs.size(); ++i){ long long multi = 1; for (int j = 0; j < strs[i].size(); ++j){ multi *= alphabetList[strs[i][j]-'a']; } map<long long, int>::iterator iter = hashTable.find(multi); if (iter != hashTable.end()){ if (iter->second != -1){ res.push_back(strs[iter->second]); iter->second = -1; } res.push_back(strs[i]); } else{ hashTable[multi] = i; } } return res; } };
每一个字母用一个质数代表,用单词中每个字符对应的质数相乘的积作为hash的key(这样查找时不需要比较单词的每一个字符,效率大大提高了),value的意义同上
相关文章推荐
- 字符串匹配——KMP算法
- Android手机的休眠状态
- Linux基础必懂:eth0,eth1,eth2,lo是什么意思?
- Understanding the Objective-C Runtime
- linux下qt使用svn的问题
- JavaWeb学习记录(十九)——开发JSTL自定义标签
- 盒子模型,块级元素和行内元素特性与区别。
- ecmobile实现支付宝支付和百度云推送遇到的问题及解决方案(android)
- saltstack内置执行模块useradd
- iOS ibeacon后台运行相关文章
- Tomcat源码学习——第1章
- apache 与 tomcat的关系
- select ......for update 语句解释 (文章中有些地方描述的不是很准确)
- 【C语言】在两个数成对出现的数组中找到一个单独的数。
- Java中的异常 Exception finally
- 【Scala】Scala的Predef对象
- C++常量(C++数值常量、字符串常量、符号常量)
- C++文件操作详解(ifstream、ofstream、fstream)
- 关于_RTC_CheckEsp_
- Python OpenCV 图像相识度对比