anagrams两种解法 用map来优化查找

来源:互联网 发布:淘宝详情页是什么 编辑:程序博客网 时间:2024/04/30 20:52

下面的解法比较纠结,是开了一个大空间,把是 anagrams的都存在一个key下,key是排序后的string  ,value为anagrams的所有字符串,如果要求输出的不只是一类anagrams的时候这种方法更好。题目做了简化没有要求输入空格的单词和字符,而且只要输出一种anagram,要知道一组字符串可能存在好多组anagram

#include <iostream>#include <vector>#include <string>#include <algorithm>#include <map>using namespace std;/**Given an array of strings, return all groups of strings that are anagrams.Note: All inputs will be in lower-case.Anagram(回文构词法)是指打乱字母顺序从而得到新的单词,比如 "dormitory" 打乱字母顺序会变成 "dirty room" , "tea" 会变成"eat"。回文构词法有一个特点:单词里的字母的种类和数目没有改变,只是改变了字母的排列顺序。因此,将几个单词按照字母顺序排序后,若它们相等,则它们属于同一组 anagrams 。关键是用map 优化查找空格如何处理??会自动删去?题目的限定是这一组字符串中,只有一类anagrams也就是说不会出现{“tea”,“eat”}和{"dirty room","dormitory"}两行返回值否则返回的应该是二维的vectorvector<string>表示的只是string数组*/class Solution {public:    vector<string> anagrams(vector<string> &strs) {        map<string,vector<string> > str;  //key 为排序后的串  ,value为anagram的串        for(int i=0;i<strs.size();i++){            string tmp = strs[i];            sort(tmp.begin(),tmp.end());            str[tmp].push_back(strs[i]);        }        //相同的元素已经存在了同一个key string的value里       map<string, vector<string> >::iterator it;  //注意只有迭代器才可以取出map的value元素       vector<string> re;       for(it = str.begin();it != str.end() ;it++ )  //这个迭代器扫描的是str的key(格式为string),相当与做每行扫描,str为关键串相同的N行串数组            if( it->second.size() > 1){  //相当于每行的内容扫描,内容为串数组,扫描并加入结果中。                for(int i = 0; i < it->second.size(); ++i)                    re.push_back(it->second[i]);  //it->second 是个数组,所以可以用second[i]来表示字符串       }       return re;    }};int main(){    vector<string> strs ;    strs.push_back("eat");    strs.push_back("tea");    strs.push_back("dormitory");    strs.push_back("dirty room");    strs.push_back("apple");    strs.push_back("me");    Solution sol;    vector<string> re = sol.anagrams(strs);    for(int i = 0;i < re.size();i++)    cout << re[i] <<" " << endl;    return 0;}

另一种解法,其实就是把上面每个情况都存入改成了只查找标记出value>1 也就是存在anagrams的字符串,再一次循环找这些string,一个个添加到结果里。

class Solution {public:    vector<string> anagrams(vector<string> &strs) {        map<string,int> tmp;        for(int i =0 ;i < strs.size();i++){            string s = strs[i];            sort(s.begin(),s.end());            if(tmp.find(s) == tmp.end())                        tmp[s] = 1;//当找不到这个元素,则置入1,否则 元素的value自加1            else                tmp[s]++;        }        vector<string > re;         for(int i =0 ;i < strs.size();i++){            string s = strs[i];            sort(s.begin(),s.end());            if(tmp[s] > 1)                re.push_back(strs[i]);        }    return re;    }};


0 0