[LeetCode]Anagrams

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

Note: All inputs will be in lower-case.

[LeetCode Source]

分析:所谓Anagrams指的是回文构词法。就是两个字符串所有的字符相同但是位置不同。比如”eat"和“tea"。

最开始我想通过一种构词方法,就是每个字母对应一个素数,这样可以计算每个字符串的特征值。

这是由于这样的数学性质:任何一个整数可以并且唯一表示成若干个素数的乘积。然后通过Map对应把string对应一个数。对大的string可能还有溢出的情况。

但是对于这一道题目不用如此麻烦。我们维护一个map表,把string的每个字母做排序后放进去,对应它的位置。然后如果在Map中找到该字符串,就说明发现了回文构词,把这两个词放入结果数组中。特别注意的是最早放进去的字符串的处理。

代码如下:

class Solution {
public:
    vector<string> anagrams(vector<string>& strs) {
        vector<string> ret;
        map<string,int> Map;
        for(int i = 0;i<strs.size();++i){
            string s = strs[i];
            sort(s.begin(),s.end());
            if(Map.find(s)==Map.end()){
                Map[s]=i;
            }
            else{
                if(Map[s]>=0){ //如果是第一次查找到
                    ret.push_back(strs[Map[s]]);
                    Map[s]=-1; //避免重复放入
                }
                ret.push_back(strs[i]);
            }
        }
        return ret;
    }
};


你可能感兴趣的:([LeetCode]Anagrams)