字母异位词分组

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

示例:

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

说明:

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

解题思路

对于一组异位词,若对其进行字符大小排列,得到的词都是相同的。

如["ate","eat","tea"]  对每个词按字符大小排列后得到的都是"aet"。

故可以使用Map<String, List> 来解决本题,key是排序的词,list存贮排序后为key的词。

如:

key="aet",list=["ate","eat","tea"]

key="ant",list=["nat","tan"]

key="abt",list=["bat"]

代码如下:

    public static List<List<String>> group(String[] strs) {

        if (strs.length == 0) return new ArrayList<List<String>>();

        Map<String, List<String>> map = new HashMap<>();
        String key;
        char[] temp;
        for (String str:strs) {
            temp = str.toCharArray();
            Arrays.sort(temp);
            key = String.valueOf(temp);
            if (!map.containsKey(key)) map.put(key, new ArrayList<String>());
            map.get(key).add(str);
        }
        return new ArrayList<List<String>>(map.values());
    }

补充:

List<List<String>> res = new ArrayList<ArrayList<String>>()   是错误的。

List<Fruit>是ArrayList<Fruit>的父类(接口),List<Fruit>=new ArrayList<Fruit>()是正确的。

但是List<Fruit>不是ArrayList<Apple>的父类,尽管Fruit是Apple的父类,List<Fruit>=new ArrayList<Apple>()是错误的。

不过,List<Fruit>容器中可以添加Apple对象。

故:

List<String>是ArrayList<String>的父类(接口),List<List<String>>不是ArrayList<ArrayList<String>>的父类。

不过res中可以添加ArrayList<String>累的对象。

猜你喜欢

转载自www.cnblogs.com/deltadeblog/p/9118973.html