Loading

【力扣】49. 字母异位词分组

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

示例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:

所有输入均为小写字母。
不考虑答案输出的顺序。


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

public List<List<String>> groupAnagrams(String[] strs) {

        //思路:
        List<List<String>> result = new ArrayList<>();
        
        for(int i = 0; i < strs.length ; i++){
            //如果非空,判断是否有字母异位的单词
            boolean isAdd = false;
            for(int j = 0 ; j < result.size() ; j++){
                boolean ec = isEctopic(strs[i],result.get(j).get(0));
                if(ec){
                    isAdd = true;
                    result.get(j).add(strs[i]);
                    break;
                }
            }
            if(!isAdd){
                List<String> centerValue = new ArrayList<>();
                centerValue.add(strs[i]);
                result.add(centerValue);
            }
        }
        return result;

    }

    //判断字母是否为字母异位
    public boolean isEctopic(String a, String b){
        if(a.length() != b.length()){
            return false;
        }

        int [] numbers = new int[26];
        for(int i = 0 ; i < a.length() ; i++){
            numbers[a.charAt(i) - 'a']++;
        }

        int index = 0;
        for(int i = 0 ; i < b.length() ; i++){
            index = b.charAt(i) - 'a';
            if(numbers[index] == 0){
                return false;
            }
            numbers[index]--;
        }
        return true;
    }

 

 

 

 

 

public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        for (String str : strs) {
            char[] array = str.toCharArray();
            Arrays.sort(array);
            String key = new String(array);
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList<List<String>>(map.values());
    }

 

 

时间复杂度:O(nklogk),其中 nn 是strs 中的字符串的数量,kk 是 strs 中的字符串的的最大长度。需要遍历 n 个字符串,对于每个字符串,需要 O(klogk) 的时间进行排序以及O(1) 的时间更新哈希表,因此总时间复杂度是 O(nklogk)。

空间复杂度:O(nk),其中 n 是 strs 中的字符串的数量,k 是 strs 中的字符串的的最大长度。需要用哈希表存储全部字符串。

 

posted @ 2020-12-15 09:10  冯廷鑫  阅读(117)  评论(0编辑  收藏  举报