1.字母異位詞分組
給你一個字符串數組,請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。
字母異位詞 是由重新排列源單詞的所有字母得到的一個新單詞。
方法一:字母排序
class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 處理邊界情況:如果輸入數組為空,直接返回空列表if (strs.length == 0) return new ArrayList<>();// 創建哈希表:鍵為排序后的字符數組(字符串形式),值為該異位詞組對應的字符串列表Map<String, List<String>> map = new HashMap<>();// 遍歷輸入的每個字符串for (String str : strs) {// 將字符串轉換為字符數組,以便進行排序char[] chars = str.toCharArray();// 對字符數組進行排序(例如:"eat" → ['a', 'e', 't'])// 排序后相同異位詞的字符數組順序相同,可作為相同的鍵Arrays.sort(chars);// 將排序后的字符數組轉換為字符串,作為哈希表的鍵// 例如:['a', 'e', 't'] → "aet"String key = String.valueOf(chars);// 檢查哈希表中是否已存在該鍵// 如果不存在,創建一個新的空列表,并與該鍵關聯if (!map.containsKey(key)) {map.put(key, new ArrayList<>());}// 將原始字符串添加到對應鍵的列表中// 例如:"eat" 和 "tea" 都會被添加到鍵 "aet" 對應的列表中map.get(key).add(str);}// 將哈希表中的所有值(列表集合)轉換為一個大列表并返回// 每個子列表包含一組互為異位詞的字符串return new ArrayList<>(map.values());}
}
方法二 字符計數法
時間復雜度和空間復雜度
class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 創建一個哈希表,用于分組異位詞// 鍵:由字母和出現次數組成的字符串(如 "a1b2")// 值:所有符合該模式的字符串列表(如 ["abb", "bab", "bba"])Map<String , List<String>> map =new HashMap<>();// 遍歷輸入的每個字符串for(String str : strs){ // 創建一個長度為26的數組,統計每個字母的出現次數// counts[0] 對應 'a' 的次數,counts[1] 對應 'b' 的次數,依此類推int[] counts =new int[26]; int length =str.length();// 遍歷字符串中的每個字符,統計次數for(int i=0;i<length;i++){// 將字符轉換為數組索引:'a' 變成 0,'b' 變成 1,...,'z' 變成 25// 對應位置的計數加1counts[str.charAt(i)- 'a' ] ++;}StringBuilder sb = new StringBuilder();// 生成用于哈希表的鍵// 按字母順序拼接每個出現過的字母及其次數(如 "a1b2")for(int i= 0 ; i < 26 ; i++ ){if(counts[i]!= 0){// 添加字母(如 'a')sb.append((char)('a'+i));// 添加該字母的出現次數(如 2)sb.append(counts[i]);}}String key = sb.toString();// 將當前字符串添加到對應的分組中// 如果鍵不存在,創建一個新的列表// 如果鍵已存在,獲取已有的列表List<String> list=map.getOrDefault(key,new ArrayList<>());list.add(str);map.put(key,list);}// 返回哈希表中所有的值(即所有分組)return new ArrayList<>(map.values());}}