字母异位词分组

该博客介绍了如何使用C++编写一个算法,将输入字符串数组按照字母异位词进行分组。首先,算法创建一个空的分组列表,然后遍历字符串数组,对于每个字符串,检查它是否与已有的分组中的任一字符串为字母异位词,若是则加入该分组,否则创建新的分组。同时,博客还包含了一个辅助函数用于判断两个字符串是否为字母异位词,通过计算每个字符串的字符指纹来快速比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        std::vector<std::vector<std::string>>groups;
        if (strs.empty()) {
            return groups;
        }
        groups.emplace_back(std::vector<std::string>{ strs[0] });
        int size = strs.size();
        for (int i = 1;i < size;i++) {
            bool found = false;
            for (auto &vec : groups) {
                const std::string &first_str = vec[0];
                if (is_anagram(first_str, strs[i])) {
                    vec.emplace_back(strs[i]);
                    found = true;
                    break;
                }
            }
            if (!found) {
                groups.emplace_back(std::vector<std::string>{ strs[i] });
            }
        }
        return groups;
    }
    bool is_anagram(const std::string &one, const std::string &other) {
        int size = one.size();
        if (other.size() != size) {
            return false;
        }
        int i = 0;
        memset(fingerprint_, 0, sizeof(fingerprint_));
        for (;i < size;i++) {
            ++fingerprint_[one[i] - 'a'];
        }
        for (i = 0;i < size;i++) {
            --fingerprint_[other[i] - 'a'];
        }
        for (i = 0;i < size;i++) {
            if (fingerprint_[one[i] - 'a']) {
                return false;
            }
        }
        return true;
    }
private:
    int fingerprint_[26];
};

https://github.com/wangzhicheng2013/leetcode/tree/main/leetcode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值