题目:
今天的题目和我上次写的有一题思路是一样的。这种字符串判定相同的题,一般都有排序和计数两种方法。
我一开始使用的是排序方法,因为排序之后的字符串会打乱顺序,所以我用了一个二维的vector数组作为辅助,对所有字符排序完成之后,再逐一循环判断。但是这样时间复杂度实在是太高了。
题解还是那么简洁精炼。相当于在我多次循环的基础上,引入了哈希表作为辅助,排序之后的元素作为map的key,而它自己本身则作为value。这个感觉有点桶的那种思想,判定相同的扔到一起去,这样一次循环就可以完成对字符串数组的所有操作。然后只需要针对key,插入key->second(value)就可以。
C++代码附带测试:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<unordered_map>
using namespace std;
//自己的做法,时间复杂度比较高
//class Solution {
//public:
// vector<vector<string>> groupAnagrams(vector<string>& strs) {
// vector<vector<string>> ans;
// vector<vector<string>> tools;
// vector<string> s;
// vector<string> fuzhu;
//
// for(int i=0;i<strs.size();i++)
// {
// fuzhu.push_back(strs[i]);
// sort(strs[i].begin(),strs[i].end());
// fuzhu.push_back(strs[i]);
// tools.push_back(fuzhu);
// fuzhu.clear();
// cout<<tools[i][0]<<endl;
// }
//
// for(int i=0;i<strs.size();i++)
// {
// if(tools[i][1]=="0")
// {
// continue;
// }
//
// s.push_back(tools[i][0]);
//
// for(int j = i+1;j<strs.size();j++)
// {
// if(tools[i][1]==tools[j][1])
// {
// s.push_back(tools[j][0]);
// tools[j][1]="0";
// }
// }
//
// ans.push_back(s);
// s.clear();
// }
//
// return ans;
// }
//};
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> mp;
for (string& str: strs) {
string key = str;
sort(key.begin(), key.end());
mp[key].emplace_back(str);//emplace_back也是插入函数,只不过比push_back更能节省空间
}
vector<vector<string>> ans;
for (auto it = mp.begin(); it != mp.end(); ++it) {
ans.emplace_back(it->second);//将当前key下的所有value插入
}
return ans;
}
};
int main()
{
vector<string> strs={"eat", "tea", "tan", "ate", "nat", "bat"};
Solution s;
vector<vector<string > > ans = s.groupAnagrams(strs);
}