数据结构和算法分析数据结构与算法

Leetcode-49 字母异位词分组

2021-10-21  本文已影响0人  itbird01

49. 字母异位词分组

解题思路

*解法2
1.解法1中用了两个list来保存数据,每次用list的contains方法来判断
2.更加高校的解法为,用哈希表来存储关键数据,map的key为排序后的字符串,value为第几组数据


哈希解法.png

两种解法对比

用时和内存对比.png

解题遇到的问题

后续需要总结学习的知识点

##解法1
class Solution {
    public static List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> result = new ArrayList<List<String>>();
        List<List<String>> real = new ArrayList<List<String>>();

        if (strs.length == 0) {
            return result;
        }

        for (int i = 0; i < strs.length; i++) {
            boolean isContain = false;
            char[] cs = strs[i].toCharArray();
            Arrays.sort(cs);
            String str = String.valueOf(cs);
            for (int j = 0; j < result.size(); j++) {
                if (result.get(j).contains(str)) {
                    result.get(j).add(str);
                    real.get(j).add(strs[i]);
                    isContain = true;
                    break;
                }
            }
            if (!isContain) {
                List<String> temp = new ArrayList<String>();
                temp.add(str);
                result.add(temp);

                List<String> temp1 = new ArrayList<String>();
                temp1.add(strs[i]);
                real.add(temp1);
            }
        }
        return real;
    }
}

##解法2
public class Solution {
    /**
     * 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次
     */
    public static List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> result = new ArrayList<>();
        if (strs.length == 0) {
            return result;
        }
        //将strs中的字符排序,如果字符串相等,则两个字符串为异位词
        //如何存储每个词的原始数据,以便于后面直接取到--首先想到用hashmap去存储,map的key为排序后的字符串,value为第几组数据
        Map<String, Integer> map = new HashMap<>();
        for (String str : strs) {
            //字符串排序
            char[] temp = str.toCharArray();
            Arrays.sort(temp);
            //此时的key为排序之后的字符串
            String key =String.valueOf(temp);
            //判断map中是否包含此可以
            if (map.containsKey(key)) {
                //如果包含,说明result中已经有此异位词相关的list列表,直接加入相应的列表即可
                result.get(map.get(key)).add(str);
            } else {
                //如何不包含,则将key加入map中
                map.put(key, result.size());
                //并且在result中新增list,用于保存当前新异位词的数组
                List<String> list = new ArrayList<>();
                list.add(str);
                result.add(list);
            }
        }
        return result;
    }

}
上一篇 下一篇

猜你喜欢

热点阅读