Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
给定一字符串数组,返回其中是由相同字符组成只是顺序不同的字符串子数组,这些字符只出现了一次的字符串不返回。
比如 abb,bab,bba,abc 返回[abb,bab,bba]
方法,将每个字符串排序,然后映射到hashmap中,hashmap设为HashMap<String, ArrayList<String>>类型。对应同一个String的(排过序的字符串)的存入value的ArrayList中。
Source
public class Solution {
public List<String> anagrams(String[] strs) {
List<String> st = new ArrayList<String>();
if(strs.length == 0) return st;
HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
for(int i = 0; i < strs.length; i++){
char[] a = strs[i].toCharArray(); //字符串转换为字符数组
Arrays.sort(a);
String b = new String(a); //再把字符数组转为字符串
if(map.containsKey(b)){
if(map.get(b).size() == 1) //第一次加入到map中的字符串,将它输出到st 因为第一次执行的是else 没有被加入到st中,而也正是当存在多个的时候第一个才需要被加入
st.add(map.get(b).get(0)); //map.get(b)返回的是对应的value,即b对应的ArrayList<String>,然后再get(0),得到加入的第一个字符串
map.get(b).add(strs[i]);
st.add(strs[i]);
}
else{
ArrayList<String> c = new ArrayList<String>();
c.add(strs[i]);
map.put(b, c);
}
}
return st;
}
}
Test
public static void main(String[] args){
String[] strs = {"tea","and","ate","eat","den"};
List<String> b = new Solution().anagrams(strs);
System.out.println(b);
}