今天第一天开始刷力扣,做了==字母异位词分组=-这个题目,题目要求如下:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 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;
}