LeetCode-anagrams

首先,回文构词法是指:字符种类数量相同,但出现在字符串中的顺序不同。
因此,两个字符串若为回文构词法,那么sort后结果一样
如果sort后的字符串在整个数组中(每个字符串都sort后)只出现过一次,那么它不应该在结果集中,至少出现两次才应该加入结果集中
因此可以使用一个map记录:键为sort后的字符串,值为原字符串第一次出现在数组中的位置。
这道题的做法是:
  遍历一遍数组:
    对于每个字符串进行sort,寻找map中是否存在这样的键:
         若不存在,将该sort后的字符串与i存入map
         若存在,且值为-1(用来记录是不是第二次出现这个值,因为第二次出现时,要把第一次出现的结果也加入结果集,若是第三次或四次出现,则不用将第一次的加入结果集),说明至少已经出现过两次,只将本次出现的字符串加入结果集即可
         若存在, 且值不为-1,说明是第二次出现,则将第一次出现的字符串加入结果集、将本次出现的字符串加入结果集、并将map中该键的值设为-1

class Solution {
public:
    vector<string> anagrams(vector<string> &strs) {
        map<string,int> m;
        vector<string> res;
        for(int i=0;i<strs.size();i++){
            string temp = strs[i];
            sort(temp.begin(),temp.end());
            //map中还不存在键为temp的对儿
            if(m.find(temp)==m.end()){
                m[temp] = i;
            }else{
                //说明该字符串是回文构词法,且已出现过至少两次
                if(m[temp]==-1){
                    res.push_back(strs[i]);
                }
                //说明该字符串是回文构词法,这是第二次出现,要把第一次出现的也加入结果集
                else{
                    res.push_back(strs[m[temp]]);
                    res.push_back(strs[i]);
                    m[temp] = -1;
                }
            }
        }
        return res;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值