LeetCode算法题之Anagrams

问题描述:
Given an array of strings, return all groups of strings that are
anagrams. Note: All inputs will be in lower-case.

Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的。
例如,“Unclear”和“Nuclear”、“Rimon”和“MinOR”都是Anagrams。编写一个程序,输入两个单词,然后判断一下,这两个单词是否是Anagrams。每一个单词的长度不会超过80个字符,而且是大小写无关的。

本题中输入的字符串都是小写的,而且此题返回值要求是vector所以只能有一组anagrams。

解题思路:
先将所有的单词按英文字母顺序排序,设置一个map,排列后的单词作为map的key,值是vector类型,存放的刚好是互为anagrams的若干单词。

class Solution
{
public:
    vector<string> anagrams(vector<string> &strs)
    {
        vector<string> result;
        map<string, vector<string> > countMap;
        if(strs.empty())
            return result;
        if(strs.size() == 1)
            return result;
        vector<string> strs_duplication;
        strs_duplication = strs;
        for(size_t i=0; i<strs_duplication.size(); i++)
        {
            string tempString = strs_duplication[i];
            //此处是大小写转换,针对本题可忽略
            for(unsigned int j=0; j<tempString.length(); j++)
            {
                if(tempString[j]>=65&&tempString[j]<=90)
                    tempString[j]=(char)(tempString[j]+32);
            }
            //使用sort函数排序
            char* s;
            const int len = tempString.length();
            s =new char[len+1];
            strcpy(s,tempString.c_str());
            sort(s,s+tempString.length());
            countMap[s].push_back(tempString);
        }

        for(map<string, vector<string> >::iterator iter = countMap.begin(); iter != countMap.end(); iter++)
        {
            if ((iter->second).size() > 1)
            {
                for(unsigned int i = 0; i < (iter->second).size(); i++)
                    result.push_back((iter->second)[i]);
            }
        }
        return result;
    }
};
发布了47 篇原创文章 · 获赞 7 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章