Anagrams

来源:互联网 发布:分水岭算法原理 编辑:程序博客网 时间:2024/06/09 18:24

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);}



0 0