昨天做的一题很有意思的字符串题目。
用到了 HashMap 当中的 Entry 链表,顺便又复习了一下 HashMap,对应的方法在代码当中已经有注释。
import java.util.*;
public class Anagrams {
/**
* 给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。
* 如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中
* @param strs
* @return
*/
public List<String> ana(String[] strs) {
List<String> result = new ArrayList<>();
if (strs == null || strs.length == 0)
return result;
Map<String, ArrayList<String>> map = new HashMap<>();
for (int i = 0; i < strs.length; i++) {
char[] arr = strs[i].toCharArray();
Arrays.sort(arr);
String s = String.valueOf(arr);
//不包含的时候创建一个新的list,并向其中添加当前元素
if (!map.containsKey(s)) {
ArrayList<String> list = new ArrayList<>();
map.put(s, list);
}
map.get(s).add(strs[i]);
}
// map.entrySet()返回“HashMap的Entry集合”,它实际是返回一个EntrySet对象 实际上调用的是 map.entrySet0()
// 这里的Map.Entry<String, ArrayList<String>> entry 创建的是一个 Map.Entry 对象
// Map.Entry<K, V> map : map.entry.Set()
// 在 HashMap 当中 Entry<K, V> implements Map.Entry<K, V>
for (Map.Entry<String, ArrayList<String>> entry : map.entrySet()) {
if (entry.getValue().size() >= 2) result.addAll(entry.getValue());
}
return result;
}
}