当前位置: 首页 > news >正文

力扣HOT100之哈希:49. 字母异位词分组

这道题自己先想了一边,定义了一个比较字符串的函数,用二重循环和一个数组来实现字符串的比较,若两个字符串是异位词,那么就返回true,否则返回false,在主函数中,同样用一个二重循环来遍历向量中的每一个字符串,看它是否在之前出现过异位词,若没有,则新建一个列表存放,若有,则将其放到异位词所在的向量中。改了好几遍才通过了3个测试样例,一提交,超时了。。。。无语。。。

//原来的超时代码
class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> result;
        vector<bool> is_add(strs.size(), false);
        for(int i = 0; i < strs.size(); i++){
            if(is_add[i]) continue;  //若已被存放则跳过本次循环
            result.push_back({strs[i]});
            for(int j = i + 1; j < strs.size(); j++){
                if(compare(strs[i], strs[j])){
                    result[result.size() - 1].push_back(strs[j]);
                    is_add[j] = true;
                }  
            }
        }
        return result;
    }
    bool compare(string s1, string s2){
        bool flag = false;
        int hash[26] = {0}; //通过s1来建立哈希表
        for(char& c : s1)
            hash[c - 'a']++;
        for(char& c : s2){
            hash[c - 'a']--;
            if(hash[c - 'a'] < 0) return false;
        }
        for(int& i : hash){
            if(i != 0) return false;
        }
        return true;
    }
};

后面看了一下题解,总结了一个比较简单的思路,通过给字符串排序和哈希表来实现。哈希表则定义为unordered_map<string, vector<string>>。异位词经过排序之后一定会变成相同的单词,因此首先对每一个单词排序,排序后的单词作为键,排序前的字符串作为值中的元素。字符串中每个字符的出现次数的向量作为unordered_map的键,遍历向量中的每一个字符串s,用一个字符串key接收这个值,然后将其排序,则ASCII码小的字符会在前面,大的在后。得到排序后的key以后,首先在unordered_map中查找有没有这个键,如果有,则将当前遍历到的字符串s添加到对应的向量中,否则直接新建一个键值对,键为当前的key,值为{s}。当遍历结束后直接遍历哈希表,将其中的每一个向量添加到结果向量中即可。

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> result;
        unordered_map<string, vector<string>> hash;
        for(string& s : strs){
            string key = s;
            sort(key.begin(), key.end());
            if(hash.find(key) != hash.end()) //找到相同分组
                hash[key].emplace_back(s);
            else
                hash[key] = {s};
        }
        for(auto& pair : hash)
            result.emplace_back(pair.second);
        return result;
    }
};

这道题后面还要刷。

相关文章:

  • macOS 安装JDK17
  • React:Router路由
  • 信奥赛CSP-J复赛集训(DP专题)(14):P7158 「dWoi R1」Password of Shady
  • JavaScript 知识点整理
  • AI赋能低代码平台可行性研究报告
  • docker学习笔记(1)从安装docker到使用Portainer部署容器
  • AI数据分析:deepseek生成SQL
  • Docker 学习(三)——数据管理
  • 《Operating System Concepts》阅读笔记:p180-p187
  • 【C++】当一个类A中没有声明任何成员变量和成员函数,sizeof(A)是多少?
  • shell文本处理
  • 深度学习的隐身术:详解 PyTorch nn.Dropout
  • Scala:for 循环遍历形式基本简单介绍(基础,高级,for-yield,特殊场景)
  • 如何将本机的vm中linux拷贝给别人使用
  • 快速高效使用——阿里通义万相2.1的文生图、文生视频功能
  • 敏捷开发学习笔记
  • 汽车智能钥匙低频PKE天线
  • 【商城实战(2)】商城架构设计:从底层逻辑到技术实现
  • 局部变量占用空间
  • deepseek免费网站大全
  • 做网站时如何去掉网站横条/青岛百度网站排名优化
  • 做网站用啥软件/app拉新推广平台代理
  • 胶州城乡建设局网站/b2b平台是什么意思
  • 怎么找做网站的公司/seo人员培训
  • 怎么做猫的静态网站/网站优化推广外包
  • 浙江政府网站大建设方案/如何写好软文