1、问题分析
题目链接:https://leetcode-cn.com/problems/group-anagrams/
具体思路是:
1、先将取出的字符排序
2、然后在key
数组中查找排序后的字符
a、如果找不到,则新建一个vector<string>
,将排序前的字符插入vector<string>
数组同时将vector<string>
添加到结果数组
b、如果查找到,则根据数组index
下标,从结果数组中取出vector<string>
,
将排序前的字符插入vector<string>
代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。
2、问题解决
笔者以C++
方式解决。
#include "iostream"
using namespace std;
#include "algorithm"
#include "vector"
#include "queue"
#include "set"
#include "map"
#include "string"
#include "stack"
class Solution {
private:
// 结果数组
vector<vector<string>> result;
// 以排序后的字符串作为 结果数组 的隐藏 key
// key_vec 保存所有的 key,即 key数组
vector<string> key_vec;
public:
vector<vector<string>> groupAnagrams(vector<string> &strs) {
// 如果字符串数组为空,直接返回空数组
if (strs.empty()) {
return result;
}
dealChen(strs);
return result;
}
/**
* 具体思路是:
* 1、先将取出的字符排序
* 2、然后在key数组中查找排序后的字符
* a、如果找不到,则新建一个 vector<string> ,将排序前的字符插入 vector<string> 数组
* 同时将 vector<string> 添加到结果数组
* b、如果查找到,则根据数组 index 下标,从结果数组中取出 vector<string> ,
* 将排序前的字符插入 vector<string>
*
* @param strs
*/
void dealChen(vector<string> &strs) {
for (int i = 0; i < strs.size(); ++i) {
// 获取排序前的字符串,因为 sort 函数会修改原字符串
// 所以这里在临时节点上操作
string temp = strs[i];
// 排序字符串
sort(temp.begin(), temp.end());
int j = 0;
// 在 key数组中查找该排序后的字符串
for (; j < key_vec.size(); ++j) {
if (key_vec[j] == temp) {
break;
}
}
// 如果没有找到
if (j >= key_vec.size()) {
// 将 该排序后的字符串作为 key 插入 key 数组
key_vec.push_back(temp);
// 新建一个 vector<string> 变量
vector<string> temp_chen;
// 将排序前字符串插入 vector<string> 变量
temp_chen.push_back(strs[i]);
// 将 vector<string> 变量插入到结果数组
result.push_back(temp_chen);
} else {
// 将排序前的字符串插入查找到的 vector<string> 变量
result[j].push_back(strs[i]);
}
}
}
};
int main() {
vector<string> strs = {"eat", "tea", "tan", "ate", "nat", "bat"};
Solution *pSolution = new Solution;
auto vector1 = pSolution->groupAnagrams(strs);
for (int i = 0; i < vector1.size(); ++i) {
for (int j = 0; j < vector1[i].size(); ++j) {
cout << vector1[i][j] << " ";
}
cout << endl;
}
system("pause");
return 0;
}
运行结果
有点菜,有时间再优化一下。
3、总结
难得有时间刷一波LeetCode
, 这次做一个系统的记录,等以后复习的时候可以有章可循,同时也期待各位读者给出的建议。算法真的是一个照妖镜,原来感觉自己也还行吧,但是算法分分钟教你做人。前人栽树,后人乘凉。在学习算法的过程中,看了前辈的成果,受益匪浅。
感谢各位前辈的辛勤付出,让我们少走了很多的弯路!
哪怕只有一个人从我的博客受益,我也知足了。
点个赞再走呗!欢迎留言哦!