问题描述
Given an array of strings, return all groups of strings that are anagrams.
即回文构词法
For example:
Input: [“tea”,”and”,”ate”,”eat”,”den”]
Output: [“tea”,”ate”,”eat”]
思考:怎么才能把一个单词的各个字母不按顺序比较
想法1: 排序
- 把str转换成char[],然后排序,利用已排序的char[],生成新的newStr,设置为key;
- 把key和原str放到oriMap中,并记录返回值。
- 如果map的返回值不为空,则表示之前存有相同key的value,放入result中(map的put会返回旧的value值),并将key和新value放入pairMap中(记录最后一次具有相同key的str);
想法2: 哈希表
- 但是哈希表比较难支持重复字母
想法3:利用数组当作key
基本与想法一一致,不过用int[26]计算str中每个单词出现的次数。
代码省略
代码:
想法一:
public class Solution {
public List<String> anagrams(String[] strs) {
Map<String, String> ori = new HashMap<>();
List<String> list = new LinkedList<>();
Map<String, String> pair = new HashMap<>();
for(String str:strs){
char[] chs = str.toCharArray();
Arrays.sort(chs);
String key = new String(chs);
String oriStr = ori.put(key, str);
if(oriStr != null){
list.add(oriStr);
pair.put(key,str); //只保留最后一个;
}
}
list.addAll(pair.values());
return list;
}
}