哈希:字母异位词分组
问题描述
分组整理字符串数组中的异位词,同组的放一起,返回所有的分组。
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
说明:由相同字母组成的字符串,互为异位词。
求解思路:哈希
对字符串排序,互为异位词的字符串排序之后一定相同。从这个角度出发,就可以把排序之后的字符串作为key,异位词作为value。以上示例处理成这样:
key | value |
abt | bat |
ant | nat,tan |
aet | ate,eat,tea |
class Solution {public List<List<String>> groupAnagrams(String[] strs) {HashMap<String, List<String>> hashMap = new HashMap<>();for (String s : strs) {// 先将字符串转为字符数组,然后对是字符数组进行排序char[] charArr = s.toCharArray();Arrays.sort(charArr);// 通过new String的构造方式,使用char数组构造字符串String strKey = new String(charArr);// 使用getOrDefault方法,处理value为空的情况List<String> list = hashMap.getOrDefault(strKey, new ArrayList<>());list.add(s);hashMap.put(strKey, list);}// 构造返回参数// 方法一:遍历hashMap// List<List<String>> result = new ArrayList<List<String>>();// for(Map.Entry<String,List<String>> entry : hashMap.entrySet()){// result.add(entry.getValue());// }// return result;// 方法二:直接调用hashMap的values()方法return new ArrayList<List<String>>(hashMap.values());}
}
常用操作回顾
1、遍历hashMap的六种方法
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;public class PrintMap {public static void main(String[] args) {HashMap<String, Integer> map = new HashMap<>();map.put("Lucy", 18);map.put("Jack", 20);map.put("Layla", 22);// 方法一:通过entrySet()方法for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());}// 方式二:使用values方法;只能访问值for (Integer value : map.values()) {System.out.println("value" + value);}// 方式三:使用keySet方法;只能访问键for (String key : map.keySet()) {System.out.println("key:" + key);}// 方式四:使用forEach();java8以上map.forEach((key, value) -> System.out.println("key:" + key + ",value:" + value));// 方式五:使用迭代器Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<String, Integer> entry = iterator.next();System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());}// 方式六:使用java Stream API;Java8以上map.entrySet().stream().forEach(entry -> System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue()));}
}
2、构造字符串的七种方法
1. 使用双引号直接创建字符串 |
|
2. 使用new关键字 |
|
3. 使用String.format()方法 |
|
4. 使用+操作符连接字符串 |
|
5. 使用StringBuilder或StringBuffer类(推荐用于大量字符串操作) | 对于需要频繁修改字符串的情况(例如,构建一个长的或复杂的字符串)。
|
6. 使用String.join()方法(适用于多个字符串的连接) | 当需要将多个字符串通过特定的分隔符连接起来时,可以使用String.join()方法。
|
7. 使用String.valueOf()方法(转换其他类型为字符串) | 如果你需要将其他类型(如整数、浮点数等)转换为字符串,可以使用String.valueOf()方法。
|
3、字符串数组的四种排序
方法一:数组使用Arrays.sort()
import java.util.Arrays;public class Main {public static void main(String[] args) {String[] strings = {"banana", "apple", "orange", "mango"};Arrays.sort(strings);System.out.println(Arrays.toString(strings));}
}
方法二:List使用Collections.sort()
(对于List<String>
)
import java.util.Arrays;
import java.util.Collections;
import java.util.List;public class Main {public static void main(String[] args) {List<String> strings = Arrays.asList("banana", "apple", "orange", "mango");Collections.sort(strings);System.out.println(strings);}
}
方法三:使用自定义比较器
例如:按字符串长度排序
import java.util.Arrays;
import java.util.Comparator;public class Main {public static void main(String[] args) {String[] strings = {"banana", "apple", "orange", "mango"};Arrays.sort(strings, new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return Integer.compare(s1.length(), s2.length()); // 按字符串长度排序}});System.out.println(Arrays.toString(strings)); // 按长度排序后的数组}
}
Lambda表达式简化:
Arrays.sort(strings, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
方法四:利用Stream API进行排序
import java.util.Arrays;
import java.util.stream.Collectors;public class Main {public static void main(String[] args) {String[] strings = {"banana", "apple", "orange", "mango"};String[] sortedStrings = Arrays.stream(strings).sorted() // 默认按字典顺序排序字符串数组元素.toArray(String[]::new); // 收集回数组中System.out.println(Arrays.toString(sortedStrings)); // 输出排序后的数组内容}
}