leetcode hot100-2

发布于:2024-03-02 ⋅ 阅读:(53) ⋅ 点赞:(0)
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

我的解法,是错误解法,只能通过 56 / 126 的测试用例

这个题就是想求,用到的所有字母一样,可以组成不同的字符串。将这样的字符串排成一个list。
我想的是肯定得把一个字符串拆开成一个一个字母才能和别的字符串比较。但是想简单了,比较的时候用的list的containsAll方法,也就是字符串包含另一个字符串中的所有字符。 其实是不行的,因为同一个字符出现多次的时候就能满足包含关系,但次数关系没有得到统计。我没通过的测试案例及错误代码。

[“ddddddddddg”,“dgggggggggg”]

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List> list = new ArrayList<List>();
        for (int i = 0; i < strs.length; i++) {
            char[] splitStr = strs[i].toCharArray();
            List splitList = new ArrayList<String>();
            for (int j = 0; j < splitStr.length; j++) {
                splitList.add(splitStr[j]);
            }
            list.add(splitList);
        }
        List<List<String>> res = new ArrayList<List<String>>();
        int[] flag = new int[strs.length];
        for (int k = 0; k < list.size(); k++) {
            List<String> temp = new ArrayList<String>();
            if (flag[k] == 0) {
                temp.add(strs[k]);
                flag[k] = 1;
            }
            for (int g = k + 1; g < list.size(); g++) {
                if (list.get(k).containsAll(list.get(g)) && list.get(k).size() == list.get(g).size() && flag[g] == 0) {
                    temp.add(strs[g]);
                    flag[g] = 1;
                }

            }
            if (temp.size() != 0) {
                res.add(temp);
            }
        }
        return res;
    }
}

其实之前想过将每个字符串按字母映射成一个26个字母的数组来统计次数。然后满足条件的字母异位词的这种数组是相同的。但是总觉得这种题应该去用集合解,而且忘记了怎么从字母映射成数组下标的方法(用counts[str.charAt(i) - ‘a’]++)。。。也想过按单个字符排序之后的字符串是相同的,但是没想到怎么去排序(用Arrays.sort()),又觉得要把每个排序后的字符串存下来,然后去和后面每个排序后的字符串比。

官方解法
1.再次用到了使用Map来避免一次循环比较
2. List list = map.getOrDefault(key, new ArrayList()); 这句话的意思是如果这个key下存在value就返回value,如果不存在就new一个List。非常好的一种写法。
3. 两个需要学习的方法 char[] array = str.toCharArray();(注意返回值是char[]类型的,也可以用split()返回也是char[]) Arrays.sort(array);
4. 千万不能定义一个 List<List> res然后在循环中res.add(list);这样会导致能匹配上的词组多次输出。使用return new ArrayList<List>(map.values()); 也是一个技巧,map.values直接将List初始化了。


class Solution {
    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());
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/group-anagrams/solutions/520469/zi-mu-yi-wei-ci-fen-zu-by-leetcode-solut-gyoc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

网站公告

今日签到

点亮在社区的每一天
去签到