• leetcode Anagrams


    题目:给定一个vector<string>,然后里面有若干个字符串的长度和组成的字母是相同的,找出这些字符串记录并返回。顾名思义,也就是抛弃单一的字符串,单一是指没有和它长度相同并且组成的字母也相同的另一个字符串。原题如下:

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

    Note: All inputs will be in lower-case.

    思路:

    1.先把每个字符串本身拷贝后排序

    2.对排序号的字符串进行map映射到整数

    3.判断大于等于2的对应字符串的下标i

    4.原来的字符串对应的下标就是要记录的答案

    class Solution {
    public:
    vector<string> anagrams(vector<string> &strs)
    {
        vector<string> ans;
        vector<string> test = strs; // 赋值到test中,以便对其排序处理
        for (int i = 0; i < strs.size(); ++i)
        {
            sort(test[i].begin(), test[i].end()); // 进行排序
        }
        map<string, int> tmp;
        for (int i = 0; i < strs.size(); ++i)// 在对应的map里++,如果出现两次那对应的值就大于等于2
        {
            tmp[test[i]]++;
        }
        for (int i = 0; i < strs.size(); ++i)
        {
            if (tmp[test[i]] >= 2)
                ans.push_back(strs[i]); //如果有大于等于2,就把相应序号,之前strs里对应的字符串记录,而不是记录已经排好序的
        }
        return ans;
    }
    };

    学习到了原来sort还可以对string进行排序。

    下面这个只在一个for里面实现。其实也是对其进行排序号,如果第一次发现一个词,那么用map的int值记录当前的标号,下一次再来一个词判断是不是之前已经有了相同的词了,如果有并且存的标号大于零,就两个都要输出,并且将标号置小于零,以便下次不会重复输出。

    class Solution {
    public:
        vector<string> anagrams(vector<string> &strs) {
            map<string,int> m;
            vector<string> result;
            int len=strs.size();
            for(int i=0;i<len;++i)
            {
                string a=strs[i];
                sort(a.begin(),a.end());
                if(m.find(a)==m.end())
                {
                    m[a]=i;
                }
                else
                {
                    int index=m[a];
                    if(index>=0)
                    {
                        result.push_back(strs[index]);
                        m[a]=-1;
                    }
                    result.push_back(strs[i]);
                }
            }
            return result;
        }
    };
    View Code
  • 相关阅读:
    filp_open/filp_close/vfs_read/vfs_write
    memcpy一种实现方法
    memset函数的实现&printf函数几种输出格式的输出结果
    break退出循环分析
    定义指针变量作为返回值函数执行时报 段错误(核心已转储)
    node实现防盗链
    js实现输入密码之延迟星号和点击按钮显示或隐藏
    rem适配
    使用字蛛教程以及遇到的bug
    es6学习笔记-proxy对象
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4063695.html
Copyright © 2020-2023  润新知