Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
首先简单介绍一下Anagram(回文构词法)。Anagrams是指由颠倒字母顺序组成的单词,比如“dormitory”颠倒字母顺序会变成“dirty room”,“tea”会变成“eat”。
回文构词法有一个特点:单词里的字母的种类和数目没有改变,只是改变了字母的排列顺序。
题目的意思是给一个String数组,找出其中由相同字母组成的单词。
例如:S = ["abc", "bca", "bac", "bbb", "bbca", "abcb"]
答案为:
["abc", "bca", "bac", "bbca", "abcb"]
只有"bbb"没有相同字母组成的单词。
思路:既然是相同字母生成的单词,那对单词里的字母排序,必然得到相同的结果。利用HashMap将排序的结果作为键,将第一次出现的单词在strs[]数组中的下标作为值,那么当下一个相同字母构成的单词出现的时候,将键值对的值修改成-1,标志值已经有重复的出现了,并将前2个都添加都list集合中,以后再出现相同的,根据查到的键值对的值为-1,直接加入到list即可。对于新出现的别的单词,依照上述过程即可。
代码如下:
public class Solution {
public List<String> anagrams(String[] strs) {
if(strs==null||strs.length==0) return null;
List<String> list = new ArrayList<String>();
HashMap<String,Integer> map = new HashMap<String,Integer>();
for(int i=0;i<strs.length;i++) {
char[] temp = strs[i].toCharArray();
Arrays.sort(temp); //将字母排序,作为识别的依据
String str = new String(temp);
if(map.containsKey(str)) {
int index=map.get(str);
if(index!=-1){ //第二次出现,便可以添加到list中了
list.add(strs[index]);
map.put(str,-1);
}
list.add(strs[i]);
}else{
map.put(str,i); //第一次出现某种字母顺序的字符串,先放到map中保存,等待第二次的出现
}
}
return list;
}
}