import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Anagrams
* Given an array of strings, return all groups of strings that are anagrams.
*
* 解:
* 1、Anagrams可以理解为回文单词集合,特点:这些单词中出现的字母相同且对应的个数也相同。
* 2、思路:
* (1)创建Map<String, ArrayList<String>>:一个Entry是一个回文单词集合。
* (2)遍历字符串数组
* (3)将字符串转换为字符数组并重排列
* (4)将重排列后的字符数组转化为字符串
* (5)map中没有该字符串,则put();map中已存在该字符串,说明是回文,add()。
* (6)遍历map,size()大于1的都是回文单词集合。
*/public class Anagrams {
public List<String> anagrams(String[] strings) {
// 结果集
List<String> result = new ArrayList<String>();
// 非空判断
if (strings==null || strings.length==0)
return null;
// 核心:Map<String, ArrayList<String>>中每一个entry都是一个回文单词集合。
Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
// 遍历数据源
for (int i=0; i<strings.length; i++) {
// 记录原始字符串
String str = strings[i];
// 转化为字符数组
char[] strChar = str.toCharArray();
// 核心:利用Arrays.sort()方法重排序
Arrays.sort(strChar);
// 再将重排序后的字符数组转化为字符串
String temp = String.valueOf(strChar);
if (map.get(temp) == null) { // map中没有该回文,则put()。
// 创建ArrayList用于存放属于一个集合的回文单词
ArrayList<String> values = new ArrayList<String>();
// 放入属于自己的回文集
values.add(str);
// 将新Entry放入map
map.put(temp, values);
} else {
// map中已经存在该回文集,则添加到对应的回文集。
map.get(temp).add(str);
}
}
// 遍历Entry
for (Map.Entry<String, ArrayList<String>> entry : map.entrySet()) {
// 只有size()大于1的Entry才能成为回文单词集合,即Anagrams。
if (entry.getValue().size() > 1) // getValue()易漏
// 将此Entry的所有values都添加给结果集
result.addAll(entry.getValue());
}
return result;
}public static void main(String[] args) {
String[] strings = {"eat", "apple", "ate", "lhp", "zhangye", "hpl"};
List<String> list = new ArrayList<String>();
list = new Anagrams().anagrams(strings);
for (int i=0;i<list.size();i++) { // .length是数组和字符串的方法
System.out.println(list.get(i));
}
}}