[LeetCode]Anagrams

本文介绍了一种高效的方法来找出一组字符串中的所有回文构词(anagrams),即那些由相同的字符组成但排列不同的字符串。通过使用排序和映射表的方式,避免了复杂且可能产生溢出的特征值计算。

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

Given an array of strings, return all groups of strings that are anagrams.

Note: All inputs will be in lower-case.

[LeetCode Source]

分析:所谓Anagrams指的是回文构词法。就是两个字符串所有的字符相同但是位置不同。比如”eat"和“tea"。

最开始我想通过一种构词方法,就是每个字母对应一个素数,这样可以计算每个字符串的特征值。

这是由于这样的数学性质:任何一个整数可以并且唯一表示成若干个素数的乘积。然后通过Map对应把string对应一个数。对大的string可能还有溢出的情况。

但是对于这一道题目不用如此麻烦。我们维护一个map表,把string的每个字母做排序后放进去,对应它的位置。然后如果在Map中找到该字符串,就说明发现了回文构词,把这两个词放入结果数组中。特别注意的是最早放进去的字符串的处理。

代码如下:

class Solution {
public:
    vector<string> anagrams(vector<string>& strs) {
        vector<string> ret;
        map<string,int> Map;
        for(int i = 0;i<strs.size();++i){
            string s = strs[i];
            sort(s.begin(),s.end());
            if(Map.find(s)==Map.end()){
                Map[s]=i;
            }
            else{
                if(Map[s]>=0){ //如果是第一次查找到
                    ret.push_back(strs[Map[s]]);
                    Map[s]=-1; //避免重复放入
                }
                ret.push_back(strs[i]);
            }
        }
        return ret;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值