• leedcode 49. 字母异位词分组(哈希,字符串内排序)


    题目描述

    难度:中等

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

    字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次。

    示例

    示例 1:

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

    输入: strs = [""]
    输出: [[""]]
    示例 3:

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

    提示:

    1 <= strs.length <= 104
    0 <= strs[i].length <= 100
    strs[i] 仅包含小写字母

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/group-anagrams
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题解

    • 哈希 字符串内字符排序
    • 思路方法都能很快想到,代码也能熟练打出来,就是对 vector<vector<string>>ans ,map 使用不够熟练。
    • 同一组的字符串,对其内字符排序后都是相同的,用它作为 哈希 的键值以示区分。
    • 字符串内排序  sort(astr.begin(),astr.end());
    class Solution {
    public:
        vector<vector<string>> groupAnagrams(vector<string>& strs) {
            unordered_map<string,int>str_map;//哈希 排序后的字符串与整数一一对应
            vector<vector<string>>ans;//存放结果
            int n=strs.size();
            int count=1;//哈希对应的整数值 不从0开始 因为如果没有对应的字符串返回也是0 以区分
            for(int i=0;i<n;i++){
                string stmp=strs[i];
    
                string new_stmp = stmp;//对字符串内字符排序
                sort(new_stmp.begin(),new_stmp.end());
    
                if(str_map[new_stmp]){//如果哈希表中有这个字符串
                    int index=str_map[new_stmp]-1;//那么找到对应的整数
                    ans[index].push_back(stmp);//在对应的vector中放入 原字符串
                }else{//如果没有出现过
                    str_map[new_stmp]=count;//那就新设置一个映射整数值
                    vector<string>vtmp;//新建一个vector
                    vtmp.push_back(stmp);//在新建一个vector中放入 原字符串
                    ans.push_back(vtmp);//再将这个新的vector放入结果中
                    count++;//映射整数值记得要更新
                }
            }
            return ans;
        }
    };

    • 官方 也是 哈希 排序
    • 代码非常简洁,它的哈希是  unordered_map<string, vector<string>> mp; 字符串与一个 vector 进行映射,并且 vector  是会变化,运行中会增加元素的。
    • 由于 unordered_map<string, vector<string>> mp,所以在运行 mp[key].emplace_back(str) 时,如果 mp[key] 还没有 vector<string>,emplace_back 会新建一个 vector<string>,在这个新建的 vector 中放入str,再把这整个 vector 与key对应,也就是一个字符串与整个vector对应。如果 mp[key] 已经有 vector<string>,就会把 str 直接放入已有的 vector 中。也可以用 push_back。
    class Solution {
    public:
        vector<vector<string>> groupAnagrams(vector<string>& strs) {
            unordered_map<string, vector<string>> mp;
            for (string& str: strs) {//遍历strs中的每个字符串
                string key = str;
                sort(key.begin(), key.end());//对字符串内的字符排序
                mp[key].emplace_back(str);//新建一个vector,放入str,再与key对应,也就是一个字符串与整个vector对应,用 push_back 是一样的
            }
            vector<vector<string>> ans;
            for (auto it = mp.begin(); it != mp.end(); it++) {//遍历哈希表
                ans.emplace_back(it->second);//用 push_back 是一样的
            }
            return ans;
        }
    };
    

    tips:如何清除 vector 中的数据

            // 如何清除vector中的数据""
            vector<string>::iterator it = strs.begin();
            while(it != strs.end()){
                if(*it==""){
                    strs.erase(it);
                }
                else it++;
            }
  • 相关阅读:
    skill:极角排序
    skill:树的重心
    [CF1091F](New Year and the Mallard Expedition)
    2018九省联考(SHOI2018)
    陷入僵局?
    2333
    雨后天晴
    听说我首次抢到食堂最早的馄饨
    难题做不动
    成绩出来了?
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/15313213.html
Copyright © 2020-2023  润新知