Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
题目要求将给定字符串数组中有着相同字母构成的列出来
首先试了下依次比较 复杂度为O(N^2)提交时超时了 代码如下:
public static List<String> anagrams(String[] strs) {
List<String> res=new ArrayList<String>();
Map<Integer,Integer> hm=new HashMap<Integer,Integer>();
for(int i=0;i<strs.length-1;i++){
if(hm.containsKey(strs[i])) continue;
int flag=0;
for(int j=i+1;j<strs.length;j++){
if(hm.containsKey(strs[j])) continue;
if(compare(strs[i], strs[j])){
if(flag==0){
res.add(strs[i]);
res.add(strs[j]);
}else{
res.add(strs[j]);
}
}
hm.put(j, 1);
flag=1;
}
}
return res;
}
public static boolean compare(String s1,String s2){
if(s1.length()!=s2.length()) return false;
Map<Character,Integer> hm=new HashMap<Character,Integer>();
for(int i=0;i<s2.length();i++){
if(hm.containsKey(s2.charAt(i))){
hm.put( s2.charAt(i), hm.get(s2.charAt(i))+1);
}else{
hm.put(s2.charAt(i), 1);
}
}
for(int i=0;i<s1.length();i++){
if(hm.containsKey(s1.charAt(i))){
if(hm.get(s1.charAt(i))==1){
hm.remove(s1.charAt(i));
}else{
hm.put(s1.charAt(i), hm.get(s1.charAt(i))-1);
}
}else{
return false;
}
}
return true;
}
随后想了一下 相同字母的不通结构如果排好序 其内容是一样的 而排序的复杂度并不高 所以 将每个字母进行排序 将排序后的字符串作为哈希表的KEY值进行存储 最后 只要确认KEY对应的VALUE是否含有两个以上的字符串 复杂度仅为O(N) 代码如下:
public static List<String> anagrams(String[] strs) {
if(strs==null||strs.length<2)return new ArrayList<>();
List<String> res=new ArrayList<String>();
Map<String,List<String>> hm=new HashMap<String,List<String>>();
for(String s:strs){
String sorted=sort(s);
if(hm.containsKey(sorted)){
List<String> ls=new ArrayList<String>();
ls=hm.get(sorted);
ls.add(s);
hm.put(sorted, ls);
}else{
List<String> ls=new ArrayList<String>();
ls.add(s);
hm.put(sorted, ls);
}
}
for(String key:hm.keySet()){
if(hm.get(key).size()>1){
res.addAll(hm.get(key));
}
}
return res;
}
public static String sort(String s){
char[] ch=s.toCharArray();
Arrays.sort(ch);
return String.valueOf(ch);
}