(LeetCode 49)Anagrams

本文探讨了如何通过Hash表和排序技术,快速识别并筛选出一组字符串中满足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.

题目:

给一组字符串,返回所有满足Anagrams(回文构词法)的字符串;

Anagrams是指由颠倒字母顺序组成的单词,比如“dormitory”颠倒字母顺序会变成“dirty room”,“tea”会变成“eat”。

回文构词法有一个特点:单词里的字母的种类和数目没有改变,只是改变了字母的排列顺序。

思路:

满足Anagrams的字符串中的字符种类和数目都一样,如果对字符串排序,那么他们必定是相等,于是可以想到通过Hash表来判断该字符串是否出现过,如果出现过,即满足Anagrams;

需要考虑的是出现三个或三个以上的判断条件,这时数组式的hash表已无法满足,因此可以采用map<string,int>,通过key-value的形式来记录;

当string没有出现过,则对应的value为字符串数组的下表i,即map[string]=i;

当string已出现过一次,则对应的value可以设为-1,并输出该对应的字符串,即map[string]=-1;

当string出现过一次以上,即map[string]==-1,则直接输出该s对应的字符串;

代码:

class Solution {
public:
    vector<string> anagrams(vector<string>& strs) {
        vector<string> result;
        int len=strs.size();
        if(len<2)
            return result;
        
        map<string,int> anagrams;
        string aStr;
        for(int i=0;i<len;i++){
            aStr=strs[i];
            sort(aStr.begin(),aStr.end());
            if(anagrams.find(aStr)==anagrams.end())
                anagrams[aStr]=i;
            else{
                if(anagrams[aStr]>=0){
                    result.push_back(strs[anagrams[aStr]]);
                    anagrams[aStr]=-1;
                }
                result.push_back(strs[i]);
            }
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值