一名24土木跨考生,不知今年结果会怎么样。
考虑到复试要考上机,因此先码为敬!
我的思路是 每天做一道新题,加上回顾基础知识点
对于每一到新题 做题(思考思路)—>理解别人的题解—>理解并打一遍代码—>在CSDN上对该题进行自己解释一遍(从而进一步加深对该题目的理解)—>再次打一遍代码
因此,今天是第一道,在这个平台,您们是前辈,写的不好的地方,还望大家指正,共同学习。
一、题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
二、代码
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
//用map实现每个字母映射一个唯一的质数
unordered_map<char,int> AlpntoPrime_map;
int prime[26]={37, 41, 13, 7, 43, 97, 17, 19, 3, 47, 73, 61, 83, 67, 101,5, 71, 31, 29, 2, 53, 59, 23, 11, 89, 79};
for(unsigned int i = 0;i < 26 ; i++){
AlpntoPrime_map[i+'a']=prime[i];
}
//计算每个字符串所对应的key
unordered_map<int,vector<string>> map1;
int key;
for(string str:strs){
key = 1 ;
for(int j = 0 ; j < str.size() ;j++){//size()别忘了加括号
key *= AlpntoPrime_map[str[j]];
}
map1[key].emplace_back(str);//容器名.emplace_back(加入的数据)
}
vector<vector<string>> result;
for(auto it = map1.begin();it !=map1.end(); it++){//map1.begin()与map1.end()都别忘了加()
result.emplace_back(it->second);
}
return result;
}
};
三、解析及理解
由 字母异位词定义 :是由重新排列源单词的所有字母得到的一个新单词,(外国大神)可以想到不同的字母可以用质数代替,若用一个单词各个字母代表的质数相乘作为结果key,则互为字母异位词的各字母的key相同,这样把各个字母的key计算出来,便可以筛选出字母异位词。
来看各段代码:
1、 vector<vector<string>> groupAnagrams(vector<string>& strs) {
//用map实现每个字母映射一个唯一的质数
unordered_map<char,int> AlpntoPrime_map;
int prime[26]={37, 41, 13, 7, 43, 97, 17, 19, 3, 47, 73, 61, 83, 67, 101,5, 71, 31, 29, 2, 53, 59, 23, 11, 89, 79};
for(unsigned int i = 0;i < 26 ; i++){
AlpntoPrime_map[i+'a']=prime[i];
}
该段代码首先初始化了一个map加一个质数数组,用以实现由字母—>质数的映射,接着用for实现对于map的填充。截至到这里我们实现了map中字母(键)—>所对应质数(值)的映射。
2、
//计算每个字符串所对应的key
unordered_map<int,vector<string>> map1;
int key;
for(string str:strs){
key = 1 ;
for(int j = 0 ; j < str.size() ;j++){//size()别忘了加括号
key *= AlpntoPrime_map[str[j]];
}
map1[key].emplace_back(str);//容器名.emplace_back(加入的数据)
}
在实现字母->质数后,我们要计算每个字符串所对应的key,这里首先初始化了一个无序map1,用以存放 key—>对应字母异位词的动态数组,接着用一个for循环,用以遍历每个字符串,初始化key,后再用二级for循环,用以对每一字符串实现遍历,同时用key来存放同一字符串中各字母所代表的质数乘积和,后将该key作为键,将该key所对应的字母存入动态数组,在之后的每一次循环中,将相同key的字母存入key对应的同一动态数组。最终实现相同的key值对应的字母在同一数组。
3、
vector<vector<string>> result;
for(auto it = map1.begin();it !=map1.end(); it++){//map1.begin()与map1.end()都别忘了加()
result.emplace_back(it->second);
}
return result;
在实现 乘积key—>动态数组 的map1后,我们需要将各动态数组返回,因此初始化一个result 动态数组,用以存放所有的动态数组。接着用for循环遍历map1,将map1的各key值所对应的动态数组加入result,最后返回result。