LeetCode字母异位词分组

今天第一天开始刷力扣,做了==字母异位词分组=-这个题目,题目要求如下:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
示例 2:
输入: strs = [“”]
输出: [[“”]]
示例 3:
输入: strs = [“a”]
输出: [[“a”]]

初始:
分析:此题主要考察单词的顺序性,单词可以转为字符后排序,异位词排序后顺序一致,可直接对比。
第一版:

public static ArrayList<List<String>> codeTest(String[] strs) {
    // 创建存放答案的数组
    ArrayList<List<String>> answerList = new ArrayList<>();
    // 存放已经统计单词的数组
    ArrayList<String> popStringList = new ArrayList<>();
    // 进行迭代计算
    for (int i = 0; i < strs.length; i ++) {
        // 临时存放符合条件单词的数组
        ArrayList<String> countList = new ArrayList<>();
        // 如果已经统计的单词中包含,直接跳出
        if (inList(popStringList, strs[i])) {
            continue;
        }
        // 排序单词
        char[] charArray = strs[i].toCharArray();
        Arrays.sort(charArray);
        String answerStr = new String(charArray);
        // 存放第一个单词
        countList.add(strs[i]);
        popStringList.add(strs[i]);
        for (int j = i + 1; j < strs.length; j ++) {
            if (strs[i].length() == strs[j].length()) {
                // 排序对比
                char[] charArray2 = strs[j].toCharArray();
                Arrays.sort(charArray2);
                String answerStr2 = new String(charArray2);
                if (answerStr.equals(answerStr2)) {
                    countList.add(strs[j]);
                    popStringList.add(strs[j]);
                }
            }
        }
        answerList.add(countList);
    }

    return answerList;
}

public static boolean inList(List<String> list, String s) {
    for (String s1 : list) {
        if (s1.equals(s)) return true;
    }
    return false;
}

此时主要性能瓶颈在于内部的嵌套循环,导致时间复杂度较高。内部的嵌套循环会遍历整个数组来找到所有符合条件的单词,这会使得算法的时间复杂度为 O(n^2),其中 n 是字符串数组的长度。
为了优化代码,可以考虑使用哈希表来减少内部循环的次数。具体做法是,对于每个单词,计算其字符频率的哈希码作为键,然后将具有相同哈希码的单词放入同一个列表中。这样可以将时间复杂度降低到 O(n * k),其中 k 是字符串的最大长度。
第二版:

public static List<List<String>> codeTest(String[] strs) {
    // 创建存放答案的数组
    List<List<String>> answerList = new ArrayList<>();
    // 创建哈希表,用于存放同一组异位词的列表
    Map<String, List<String>> map = new HashMap<>();

    // 进行迭代计算
    for (String str : strs) {
        // 将字符串转换为字符数组,并排序
        char[] charArray = str.toCharArray();
        Arrays.sort(charArray);
        // 将排序后的字符数组转换为字符串作为键
        String key = new String(charArray);
        // 如果哈希表中不存在该键,则创建新的列表,并将其放入哈希表中
        if (!map.containsKey(key)) {
            map.put(key, new ArrayList<>());
        }
        // 将原始字符串放入对应的列表中
        map.get(key).add(str);
    }

    // 将哈希表中的所有值放入答案列表中
    for (List<String> list : map.values()) {
        answerList.add(list);
    }

    return answerList;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值