每日一题:字母异位词分组

本文介绍了一种使用C++编程语言解决字母异位词问题的方法,通过unordered_map和排序技巧,将给定的字符串数组中所有字母异位词组合在一起。解决方案展示了如何利用map存储排序后的字符串作为键,原始字符串作为值,并在遍历过程中合并同组异位词。
摘要由CSDN通过智能技术生成

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

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

示例 1:

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

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

示例 2:

输入: strs = [""]

输出: [[""]]

示例 3:

输入: strs = ["a"]

输出: [["a"]]

提示:

  • 1 <= strs.length <= 10^4
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

字母异位词(Anagram)是指两个字符串包含完全相同的字符,只是顺序不同。例如,"eat" 和 "tea" 是字母异位词,因为它们都包含相同的字母 e、a 和 t,只是顺序不同。

字母异位词通常用于密码学、语言学和计算机科学等领域。在密码学中,字母异位词可以用来对信息进行加密,而在语言学中,字母异位词可以用来研究语言的结构和演变。在计算机科学中,字母异位词可以用来解决各种问题,例如字符串比较和文本搜索。

判断两个字符串是否是字母异位词的方法:

  1. 排序比较:将两个字符串排序,如果排序后的字符串相等,则它们是字母异位词。
  2. 字符计数:创建一个包含所有字符及其计数的哈希表或字典。对于每个字符串,遍历其字符并更新哈希表中的计数。如果两个哈希表的计数相同,则字符串是字母异位词。
  3. 位掩码:使用位掩码来跟踪每个字符的出现。对于每个字符串,遍历其字符并使用位掩码设置相应的位。如果两个位掩码相等,则字符串是字母异位词。

针对本题,字符串的规模较小,因此可以采取排序比较的方式,消耗的时间并不大。

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string,vector<string>> map;
        vector<vector<string>> result;
        for(string& s:strs){
            string temp = s;
            sort(temp.begin(),temp.end());
            map[temp].emplace_back(s);
        }
        for(auto& key:map){
            result.emplace_back(key.second);
        }
        return result;
    }
};

思路概述:

  • 使用 map存储输入字符串的已排序版本作为键,原有字符串数组作为值。

  • 逐个迭代输入字符串(strs):

    • 对于每个字符串 s,创建一个临时字符串 temp,内容为 s
    • temp 进行排序,这样异位词就会有相同的排序结果。
    • 检查 map 中是否已经存在 temp。如果存在,将 原始字符串s 添加到与 temp 关联的字符串数组中。如果不存在,创建一个新的条目,其中 temp 是键,包含 s 的字符串数组是值。

这里可以提炼出几个初学c++的使用方法:

  • map的定义 unordered_map<string,vector<string>> map
  • for(string& s:strs) 和 for(string s:strs)的区别

    & 符号: for(string& s:strs) 使用 引用,而 for(string s:strs) 使用 副本
    修改元素: 使用引用可以修改容器中的原始元素,而使用副本只能修改循环变量的副本。
    效率: 使用引用可以避免创建和复制变量,从而提高代码效率。
    修改原始变量: 对引用所做的任何修改都会反映在原始变量上。

  • emplace_back 和 push_back的区别
    emplace_back
    是 C++ 标准库中 vector 和其他容器类提供的方法,用于在容器末尾添加新元素。与 push_back 方法不同,emplace_back 允许直接构造新元素,而无需创建临时对象。
    效率: emplace_backpush_back 更高效,因为它避免了创建和复制临时对象。
    通用性: emplace_back 可以用于构造任何类型的元素,包括自定义类型和复杂对象。
     
  • key.second
    map 是一个 unordered_map<string, vector<string>>,使用范围遍历时,这里的key并不是键,而是键值对。

    其中:
    key.first 是排序后的字符串(键)。
    key.second 是属于该字母异位词组的原始字符串的向量(值)。

    假设 map 如下:

    map = {
        {"abc", {"abc", "cab"}},
        {"def", {"def", "fed"}}
    }
    

    当循环遍历 map 时:
    第一次迭代:key.first 为 "abc",key.second 为 {"abc", "cab"}。
    第二次迭代:key.first 为 "def",key.second 为 {"def", "fed"}。

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值