字符串相关问题

188 阅读1分钟

字母异位词分组

题目

image.png

版本1 正确

    public List<List<String>> groupAnagrams(String[] strs) {
        // 将strs中字母异位词组合在一起, 放到一个List中
        // 字母异位词即字母种类和数量相同, 但是位置不同, 例如abc和cba
        // 因此题目的核心就是如何为异位词计算出一个相同的标志, 这样就能统计相同异位词的列表
        Map<String, List<String>> key2ListMap = new HashMap<>();


        // 判断两个字符串是否是异位词, 没有什么讨巧的办法, 就是将字符串中的字符排序后, 比较大小
        // 所有异位词排序后的结果是一样的, 因此可以作为同一组异位词的key
        for(int i = 0; i < strs.length; i ++) {
            char [] temp = strs[i].toCharArray();
            Arrays.sort(temp);
            String key = new String(temp);
            List<String> preList = key2ListMap.getOrDefault(key, new ArrayList<>());
            preList.add(strs[i]);
            key2ListMap.put(key, preList);
        }

        return new ArrayList<>(key2ListMap.values());
    }

正确的原因

(1) 如何为每个异位词找到相同的标志

(2) 字符串缓存池的问题, 才保证了String key = new String(temp); 都是同一个对象