美文网首页
LeetCodeDay37 —— 字母异位词分组★★★

LeetCodeDay37 —— 字母异位词分组★★★

作者: GoMomi | 来源:发表于2018-05-15 15:43 被阅读0次

49. 字母异位词分组

描述
  • 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例
输入:
  ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
  [
    ["ate","eat","tea"],
    ["nat","tan"],
    ["bat"]
  ]
说明:
  所有输入均为小写字母。
  不考虑答案输出的顺序。
思路
  1. 暴力解法,将字符串数组中的字符串两两比较,相同的放在同一个Vector中
  2. 利用容器Map<string, vector<string>>, 将字符串String排序后作 Key, 同 Key 的字符串放在一个桶内。
// 超时算法
class Solution_49_OverTime {
 public:
  vector<vector<string>> groupAnagrams(vector<string>& strs) {
    vector<vector<string>> ret;
    vector<bool> isTag;
    isTag.assign(strs.size(), false);
    for (int i = 0; i < strs.size(); ++i) {
      if (isTag[i]) continue;
      vector<string> tmp;
      tmp.push_back(strs[i]);
      for (int j = i + 1; j < strs.size(); ++j) {
        if (isAnagram(strs[i], strs[j])) {
          tmp.push_back(strs[j]);
          isTag[j] = true;
        }
      }
      ret.push_back(tmp);
    }
    return ret;
  }
  bool isAnagram(string s1, string s2) {
    sort(s1.begin(), s1.end());
    sort(s2.begin(), s2.end());
    return s1 == s2;
  }
};

// 错误的思路,字符和加位数并不能唯一确定字符串,如ac和bb
class Solution_49_Error {
 public:
  vector<vector<string>> groupAnagrams(vector<string>& strs) {
    vector<vector<string>> ret;
    unordered_map<int, int> hash;
    vector<int> weight;
    // 计算出每个字符串的权值
    for (string str : strs) {
      int tmp = 0;
      for (char ch : str) {
        tmp += ch - 'a';
      }
      weight.push_back(tmp * 10 + str.size());
    }
    // 根据权重分配异位词
    for (int i = 0; i < strs.size(); ++i) {
      auto iter = hash.find(weight[i]);
      if (iter == hash.end()) {
        hash[weight[i] = ret.size();
        ret.push_back({strs[i]});
      } else {
        ret[iter->second].push_back(strs[i]);
      }
    }
    return ret;
  }
};

// string 作 key, 将对应的字符串放入数组中
class Solution_49 {
 public:
  vector<vector<string>> groupAnagrams(vector<string>& strs) {
    vector<vector<string>> ret;
    unordered_map<string, vector<string>> mp;
    for(const string& str : strs){
      string t = str;
      sort(t.begin(), t.end());
      mp[t].push_back(str);
    }
    for(const auto& val : mp){
      ret.push_back(val.second);
    }
    return ret;
  }
};

相关文章

  • LeetCodeDay37 —— 字母异位词分组★★★

    49. 字母异位词分组 描述 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串...

  • LeetCode 字母异位词分组 Rust

    LeetCode 字母异位词分组 Rust 题目 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同...

  • 字母异位词分组

    题目:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示例: 输入: ["...

  • 字母异位词分组

    题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/grou...

  • 字母异位词分组

    给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示例: 输入: ["eat...

  • 字母异位词分组

    给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示例: 输入: ["eat...

  • 字母异位词分组

    49. 字母异位词分组[https://leetcode-cn.com/problems/group-anagra...

  • leetCode进阶算法题+解析(六)

    字母异位词分组 题目:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示例...

  • 49. 字母异位词分组

    49. 字母异位词分组 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示...

  • 每日一题20201214(49. 字母异位词分组)

    49. 字母异位词分组[https://leetcode-cn.com/problems/group-anagra...

网友评论

      本文标题:LeetCodeDay37 —— 字母异位词分组★★★

      本文链接:https://www.haomeiwen.com/subject/fdfydftx.html