目录

每日一题一一Leetcode49.-字母异位词分组

每日一题一一Leetcode49. 字母异位词分组

每日一题一一Leetcode49. 字母异位词分组

作者:blue

时间:2025.3.11

题目链接:

解法一(超时):本题要将所有相同字母组成的字符串,存储到同一个集合,然后最后放到一个大集合中返回,我的思路是遍历每一个未被加入集合的字串,然后判断后面的字串是否与其构成变为词,整体代码时间复杂度为 O ( n 2∗ k l o g k )

class Solution {
public:
    bool check(string src,string dest){
        if(src.size()!=dest.size()) return false;
        vector<char> vec_src;
        vector<char> vec_dest;
        for(int i=0;i<src.size();i++) vec_src.push_back(src[i]);
        for(int i=0;i<dest.size();i++) vec_dest.push_back(dest[i]);
        sort(vec_src.begin(),vec_src.end());
        sort(vec_dest.begin(),vec_dest.end());
        for(int i=0;i<vec_src.size();i++){
            if(vec_src[i]!=vec_dest[i]) return false;
        }
        return true;
    }
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> res;
        vector<int> Hash(strs.size(),0);
        for(int i=0;i<strs.size();i++){
            if(Hash[i]==0){//还没有被归化
                Hash[i]=1;
                vector<string> minres;
                minres.push_back(strs[i]);
                for(int j=i+1;j<strs.size();j++){
                    if(check(strs[i],strs[j])){
                        minres.push_back(strs[j]);
                        Hash[j]=1;
                    }
                }
                res.push_back(minres);
            }
        }
        return res;
    }
};

解法二:优化解法

  1. 使用哈希表 :借助 unordered_map<string, vector<string>> 来存储排序后的字符串及其对应的变位词组。
  2. 遍历字符串数组 :针对每个字符串,先复制一份并对其进行排序,接着把原字符串添加到排序后字符串对应的变位词组中。
  3. 提取结果 :遍历哈希表,将每个变位词组添加到最终结果 result 里。

通过使用哈希表来优化,将时间复杂度降低到 O ( nk l o g k )。

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> res;
        unordered_map<string,vector<string>> map;
        for(string s : strs){
            string scopy = s;
            sort(s.begin(),s.end());//以排序后的字符串为键,没排序的为值
            map[s].push_back(scopy);
        }
        for(auto pair : map){//直接取每个键的值即可
            res.push_back(pair.second);
        }
        return res;
    }
};

Java代码优化解法:

import java.util.*;

public class Day01_demo49 {
    public static void main(String[] args) {
        String[] str = {"eat", "tea", "tan", "ate", "nat", "bat"};
        List<List<String>> lists = groupAnagrams(str);
        for (List<String> list : lists) {
            System.out.println(list);
        }
    }
    public static List<List<String>> groupAnagrams(String[] strs) {
        HashMap<String, ArrayList<String>> map = new HashMap<>();
        for (String str : strs) {
            char[] charArrays = str.toCharArray();//先变成字符数组
            Arrays.sort(charArrays);//后对字符数组进行排序
            String KeyStr = new String(charArrays);//够造出键
            // 使用 computeIfAbsent 方法,如果键不存在则创建一个新的 ArrayList
            map.computeIfAbsent(KeyStr, k -> new ArrayList<>()).add(str);
        }
        return new ArrayList<>(map.values());
    }
}