leeocde入门计划 49.字母异位词分组

 

大家好,我是阿改。

随着互联网大厂面试难度的提升,算法题的难度也越来越高,手撕算法题也变成了面试中不可或缺的一部分,今天我们来解析leecode的49.字母异位词分组

 

题目链接

 

49. 字母异位词分组 - 力扣(LeetCode)

 

题目描述

 

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

 

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

 

示例

 

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

 

示例 2:

输入: strs = [""]输出: [[""]]

 

示例 3:

输入: strs = ["a"]输出: [["a"]]

 

解题思路

 

由题意可知,将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

 

将含有相同字母顺序不同的单词放入同一个数组;

如["nat","tan"]都由一个a,一个n,一个t构成,所以分到一组,["ate","eat","tea"]都是一个a,一个e,一个t,所以分到一组。

 

我们可以创建一个key-val的容器,C++可以使用unordered_map,Go可以使用map,key保存排序后的字符串,val设定成数组,将排序后相同的字符串放进同一个val数组中。

 

代码实现

 

C++版本:

vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string,vector<string>>map;
        for(auto &s:strs){
            string tmp = s;
            sort(tmp.begin(),tmp.end());
            map[tmp].push_back(s);
        }
        vector<vector<string>>ans;
        ans.reserve(map.size());
        for(auto &[key,vec]:map){
            ans.push_back(vec);
        }
        return ans;
    }

 

GO版本:

func groupAnagrams(strs []string) [][]string {
    numsMap := make(map[string][]string)
    for _,str := range strs {
        sort_str := []byte(str)
        sort.Slice(sort_str,func(i int,j int)bool{
            return sort_str[i]<sort_str[j]
        })
        key := string(sort_str)
        numsMap[key] = append(numsMap[key],str)
    }
    var ans [][]string
    for _,vec := range numsMap{
        ans=append(ans,vec)
    }
    return ans
}

 

如果大家觉得阿改写的不错,希望可以赏个脸关注下微信公众号哦!

please!please!please!

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值