字母异位词分组

一名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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值