LeetCode算法题之Anagrams

来源:互联网 发布:java数据源配置 编辑:程序博客网 时间:2024/06/15 20:51

问题描述:
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;    }};
0 0