Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
解题思路:anagrams:回文构词法,一组单词的字母数量和种类都一样,只是字母顺序不同。空字符串的anagrams为空字符串。
使用hash来存储键值对:将每个string字母排序后的字符串作为key,value值存string在数组的位置,
同时将value值个数>1的key保存到list中用于最后输出。
public class Solution {
public void sort(char [] tmp,int start,int end){
char data=tmp[start];
int left=start;
int right=end;
while(left<right){
while(left<right&&tmp[right]>=data){
right--;
}
if(left<right){
tmp[left]=tmp[right];
}
while(left<right&&tmp[left]<=data){
left++;
}
if(left<right){
tmp[right]=tmp[left];
}
}
tmp[left]=data;
if(start<left-1){
sort(tmp,start,left-1);
}
if(left+1<end){
sort(tmp,left+1,end);
}
}
public List<String> anagrams(String[] strs) {
List<String> rs=new ArrayList<String> ();
List<String> key=new ArrayList<String>();
Map<String,List<Integer>> map=new HashMap<String,List<Integer>>();
int len=strs.length;
if(strs==null){
return null;
}
if(len==0||len==1){
return rs;
}
for(int i=0;i<len;i++){
String data="";
if(!strs[i].equals("")){
char [] tmp=strs[i].toCharArray();
sort(tmp,0,tmp.length-1);
data=String.valueOf(tmp);
}
if(map.containsKey(data)){
List<Integer> list=map.get(data);
list.add(i);
if(!key.contains(data)){
key.add(data);
}
}else{
List<Integer> list=new ArrayList<Integer>();
list.add(i);
map.put(data,list);
}
}
for(String str:key){
List<Integer> lst=map.get(str);
for(int p:lst){
rs.add(strs[p]);
}
}
return rs;
}
}