• 49. Group Anagrams


    Given an array of strings, group anagrams together.

    For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"]
    Return:

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

    Note: All inputs will be in lower-case.

    要用Java写的话,就是在考Java方法的熟练度。用Map来降低二次查找的复杂度,Hash原理。把每个字符串排好序,相同放一个ArrayList,不同则新开一个,Map把排序好的和每个ArrayList对应,最后ans把Map的所有Values(ArrayList)添加进去即可。

    但是看到leetcode官方的题解,发现煞笔了,直接return new ArrayList(mp.values());就可以了,利用ArrayList的构造函数,所以这题很考API的运用。

    import java.lang.reflect.Array;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    class Solution {
        public List<List<String>> groupAnagrams(String[] strs) {
    //        List<List<String>> ans = new ArrayList<>();
            //lc里面一定要判断这个
            if (strs.length == 0)
                return new ArrayList();
            Map<String, List<String>> mp = new HashMap<String, List<String>>();
            
            for(int i = 0; i < strs.length; i++) {
                char tmpArray[] = strs[i].toCharArray();
                //把字符排序
                Arrays.sort(tmpArray);
                String SortString = String.valueOf(tmpArray);
    //            String tmpString = new String(tmpArray);
                
                if(mp.containsKey(SortString)) {
                    mp.get(SortString).add(strs[i]);
                }
                else {
                    List<String>tmpList = new ArrayList<String>();
                    tmpList.add(strs[i]);
                    mp.put(SortString, tmpList);
                }
            }
            
            //获取所有的mp映射值动态数组
    //        Iterator iter = mp.values().iterator();
    //        while(iter.hasNext()) {
    //            List<String> tmpList = new ArrayList<String>((ArrayList<String>)iter.next());
    //            ans.add(tmpList);
    //        }
            return new ArrayList(mp.values());
        }
    }
    
    public class Main {
    
        
        public static void main(String[] args) {
            Solution s  = new Solution();
            String[] ss = {"eat", "tea", "tan", "ate", "nat", "bat"};
            System.out.println(s.groupAnagrams(ss));
        }
    
    }

    时间复杂度的分析:

     外层加上排序的,这里Sort是默认为快排的平均时间复杂度了。

    还有一个更秒的方法,也稍微比这个优了一点,详见:https://leetcode.com/problems/group-anagrams/solution/

  • 相关阅读:
    面试题(三)
    面试题(二)
    经典面试题(一)
    $.ajax()实现简单计算器
    [hdu5373 The shortest problem]模拟
    [hdu5371 Hotaru's problem]最大回文半径
    [hdu5372 Segment Game]树状数组
    [zoj3813]Alternating Sum 公式化简,线段树
    [hdu5348]图上找环,删环
    [hdu5360]贪心
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7781458.html
Copyright © 2020-2023  润新知