目錄
一、哈希表相關理論
二、思路
核心思路
三、相關題目
四、總結
一、哈希表相關理論
代碼隨想錄刷題day15|(哈希表篇)242.有效的字母異位詞、383.贖金信-CSDN博客
二、思路
首先,創建一個map集合,遍歷字符串數組,對數組中每一個字符串(單詞)比如"abc" 進行如下操作:創建一個長度為26的數組count,遍歷當前字符串,計算出每個字母出現的次數,用count來存儲元素中每個字母出現的次數,之后將數組count轉換成對應字符串(通過sb,添加數組元素,然后toString);
map集合中的鍵就存放該頻率字符串,也就是"1#1#1#0#...." (以"abc"為例);
map集合中鍵對應的值則存放 當前遍歷(操作)的原數組中的字符串(字母)即 "abc";所以值的類型是列表 list<String>;
“abc” ---> [1,1,1,0,0.....] --->“#1#1#1#0.....”=key
map中添加的邏輯是:首先 判斷該key是否存在,如果不存在,則創建一個ArrayList對象,如果存在,無需創建;
不管key存不存在,都要再將當前 處理的字符串“abc” 添加到list列表中["abc","acb","bca"];
那么最終,map中所有的值value 就是所有的字母異位詞的分組,比如:
key:“#1#1#1#0.....”? ? value:["abc","acb","bca"]
key:"#0#1#1#1#0..."? value:["bcd","bdc","cdb"]
.......
最后獲取map中的所有值的集合map.values(),返回(Collection<List<String>>);
也就是值是什么類型 外層再加一個collection;
new ArrayList<>(...)?? ?將 Collection 轉換為 List,確保返回類型正確且可修改;
核心思路
-
字母計數:
-
為每個單詞創建一個長度為26的數組,統計每個字母出現的次數
-
例如:"aab" → [2,1,0,0,...,0](a出現2次,b出現1次)
-
-
生成唯一鍵:
-
將計數數組轉換為不可變的數據結構(如元組或字符串)作為哈希表的鍵
-
例如:[2,1,0,...] → 轉換為元組 (2,1,0,...) 或字符串 "2#1#0#..."
-
-
哈希表分組:
-
使用這個鍵將原始單詞分組存儲
-
三、相關題目
49.字母異位詞分組
class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map = new HashMap<>();for(String str : strs){int[] count = new int[26];for(char c : str.toCharArray()){//int[] count = new int[26];count[c - 'a']++;}StringBuilder sb = new StringBuilder();for(int i : count){sb.append("#");sb.append(i);}String k = sb.toString();if(!map.containsKey(k)){List<String> list = new ArrayList<>();map.put(k, list);}map.get(k).add(str);}return new ArrayList<>(map.values());}}
四、總結
本題和有效的字母異位詞不太一樣,因為涉及到分組,怎么分組,怎么得到分組后的最終結果,但是最初處理字母異位詞的邏輯相同,均使用數組;
還有最后的map集合put鍵值對的邏輯,如果按照下面的寫法:
String k = sb.toString();
if(!map.containsKey(k)){//map中不包含kList<String> list = new ArrayList<>();list.add(str);map.put(k, list);
}
錯因:只在key不存在時添加字符串,這樣會漏掉后續相同key的字符串;
每次遇到一個字符串時,都創建了一個新的?ArrayList
?并覆蓋了 Map 中已有的值,這樣會導致之前的同組異位詞被覆蓋丟失;
只有當key不存在時才創建新list;
無論key是否存在,都要將當前字符串添加到對應的list中;