タイトル説明
文字列の配列を並べ替え、すべてのアナグラムをグループ化するメソッドを記述します。アナグラムは、同じ文字で配置が異なる文字列です。
注:この質問は、元の質問から少し変更されています
例:
入力:[“ eat”、“ tea”、“ tan”、“ ate”、“ nat”、“ bat”]、
出力:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
問題解決のアイデア
主に2つの部分があります。
1.活用を判断する方法は?
- 文字列をソートし、文字をazAZの順序で並べ替えます。
2.活用を分類する方法は?
- ハッシュテーブルを使用して、アナグラムを同じリストに入れます。
- 最後に、リストに変換して返すことができます。
import java.util.*;
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
/**
* 主要是两个部分:
*
* 1、如何判断变位词?
* 对字符串进行排序,将字符按照azAZ的顺序排列。
*
* 2、如何归类变位词?
* 使用散列表,将变位词放到同一个列表中。
* 最后转化为列表返回即可。
*
* @param strs
* @return
*/
public List<List<String>> groupAnagrams(String[] strs) {
//新建hash表,对变位词统计到一起
HashMap<String , LinkedList<String>> map = new HashMap<String, LinkedList<String>>();
//逐个访问字符串,归入同类变位词,不存在则新增
for (String s : strs) {
String key = sortChar(s);
if (!map.containsKey(key)){
map.put(key,new LinkedList<>());
}
LinkedList<String> tmp = map.get(key);
tmp.push(s);
}
List<List<String>> res = new LinkedList<>();
for (String key : map.keySet()) {
res.add(map.get(key));
}
return res;
}
private String sortChar(String s) {
char[] chars = s.toCharArray();
Arrays.sort(chars);
return new String(chars);
}
}
//leetcode submit region end(Prohibit modification and deletion)