给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
思路 hashmap
本质要想清楚hashmap中 键和值都存的是什么
思路:利用HashMap 键为排序后相等的异位词 值为List 里面装的是所有排序后相等的异或词集合
分为两种情况
如果没有 就新建一个arraylist数组,再add
如果有的话直接add
所以最后都要add就放到if外面
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//返回值是List ,List里面是List 装的String 定义一个HashMap 值为List
Map<String,List> map = new HashMap<String,List>();
for(String i:strs){
char[] arr=i.toCharArray(); //将字符串转换成数组
Arrays.sort(arr); //将字符数组排序
String str=String.valueOf(arr);//将字符串数组变回字符串
if(!map.containsKey(str)){
map.put(str,new ArrayList()); //若不存在建立映射关系 排序后的字符串—>新的List集合(装未排序的异位词)
}
map.get(str).add(i);//建立映射关系户后添加 以及存在映射关系后添加 单词
}
return new ArrayList(map.values());//返回值是List集合 通过构造器 构造一个包含指定 collection 的元素的列表
}
}
- char[] arr=i.toCharArray(); //将字符串转换成数组
- String str=String.valueOf(arr);//将字符串数组变回字符串
- return new ArrayList(map.values());
map.values() 是map中所有value的集合
看到的答案 质数
在美版leetcode上看到大神的思路,用质数表示26个字母,把字符串的各个字母相乘,这样可保证字母异位词的乘积必定是相等的。其余步骤就是用map存储,和别人的一致了。(这个用质数表示真的很骚啊!!!)
map<Integer, List>
前面Integer是每个字符串所有字母的质数之积
List中是异位词
注:static块
map前面必须有static标注
class Solution {
private static Map<Character,Integer> table = new HashMap<>();
static{
table.put('a', 2);
table.put('b', 3);
table.put('c', 5);
table.put('d', 7);
table.put('e', 11);
table.put('f', 13);
table.put('g', 17);
table.put('h', 19);
table.put('i', 23);
table.put('j', 29);
table.put('k', 31);
table.put('l', 37);
table.put('m', 41);
table.put('n', 43);
table.put('o', 47);
table.put('p', 53);
table.put('q', 59);
table.put('r', 61);
table.put('s', 67);
table.put('t', 71);
table.put('u', 73);
table.put('v', 79);
table.put('w', 83);
table.put('x', 89);
table.put('y', 97);
table.put('z', 101);
}
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<Integer,List<String>> map=new HashMap<>();
for(String str :strs){
int key=1;
for(int i=0;i<str.length();i++){
key *= table.get(str.charAt(i));
}
if(!map.containsKey(key)){
List<String> list=new ArrayList<>();
list.add(str);
map.put(key,list);
}
else
map.get(key).add(str);
}
return new ArrayList<>(map.values());
}
}