zoukankan      html  css  js  c++  java
  • 【力扣】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 中的字符串的的最大长度。需要用哈希表存储全部字符串。

    一个入行不久的Java开发,越学习越感觉知识太多,自身了解太少,只能不断追寻
  • 相关阅读:
    [转]多线程更新Processbar
    不能因技术后天的死 而迷茫了今天的“学” 生
    NSIS 安装包制作相关
    [转]yslow 评分标准
    c# winform 打印 窗体 及 窗体控件内容 的 初级尝试
    严重认知自身成长 与诸博友共勉
    [转]NSIS 的 Modern UI 教程
    爱的幸福
    遍历WinForm窗体 根据语言类型设置其控件Text显示
    多借鉴 多思考
  • 原文地址:https://www.cnblogs.com/fengtingxin/p/14136796.html
Copyright © 2011-2022 走看看