C++ 同字符词语分组

已知一组字符串,将所有anagram(由颠倒字母顺序而构成的字)放到一起输出。
例如:[“eat”,“tea”,“tan”,“ate”,“nat”,“bat”]
返回:[[“ate”,“eat”,“tea”],[“nat”,“tan”],“bat”]

算法1:

#include<vector>
#include<map>
#include<string>
#include<algorithm>
class Solution
{
public:
 Solution() {}
 ~Solution() {}
 std::vector<std::vector<std::string>> groupAnagrams(std::vector<std::string>& strs)
 {
  std::vector<std::vector<std::string>> result;
  std::string str;
  std::map<std::string, std::vector<std::string>> anagram;
  for (int  i = 0; i < strs.size(); i++)
  {
   str = strs[i];
   std::sort(str.begin(), str.end());
   if (anagram.find(str)==anagram.end())
   {
    std::vector<std::string> item;
    anagram[str] = item;
   }
   anagram[str].push_back(strs[i]);
  }
  std::map<std::string, std::vector<std::string>> ::iterator it;
  for (it=anagram.begin(); it!=anagram.end(); it++)
  {
   result.push_back((*it).second);
  }
  return result;
 }
};

运行结果为:

[bat]
[eat][tea][ate]
[tan][nat]

计算方法二:

#include<string>
#include<vector>
#include<map>
class Solution
{
public:
 Solution() {}
 ~Solution() {}
 std::vector<std::vector<std::string>> groupAnagrams(std::vector<std::string>& strs)
 {
  std::vector<std::vector<std::string>> result;
  std::map<std::vector<int>, std::vector<std::string>> anagram;
  for (int i = 0; i < strs.size(); i++)
  {
   std::vector<int> vec;
   change_to_vec(strs[i],vec);
   if (anagram.find(vec)==anagram.end())
   {
    std::vector<std::string> item;
    anagram[vec] = item;
   }
   anagram[vec].push_back(strs[i]);
  }
  std::map<std::vector<int>, std::vector<std::string>> :: iterator it;
  for (it=anagram.begin(); it!=anagram.end(); it++)
  {
   result.push_back((*it).second);
  }
  return result;
 }
private:
 void change_to_vec(std::string& str, std::vector<int>& vec)
 {
  for (int i = 0; i < 26; i++)
  {
   vec.push_back(0);
  }
  for (int i = 0; i < str.length(); i++)
  {
   vec[str[i] - 'a']++;
  }
 }
};
int main()
{
 std::vector<std::string> strs;
 strs.push_back("eat");
 strs.push_back("tea");
 strs.push_back("tan");
 strs.push_back("ate");
 strs.push_back("nat");
 strs.push_back("bat");
 Solution solve;
 std::vector<std::vector<std::string>> result = solve.groupAnagrams(strs);
 for (int  i = 0; i < result.size(); i++)
 {
  for (int j = 0; j < result[i].size(); j++)
  {
   printf("[%s]", result[i][j].c_str());
  }
  printf("\n");
 }
 return 0;
}

运行结果为:

[tan][nat]
[eat][tea][ate]
[bat]
发布了80 篇原创文章 · 获赞 63 · 访问量 2347

猜你喜欢

转载自blog.csdn.net/weixin_44208324/article/details/105020552