题目
乱序字符串
给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中。
样例
对于字符串数组 ["lint","intl","inlt","code"]
返回 ["lint","inlt","intl"]
注意
Java Code
Java Code
所有的字符串都只包含小写字母
解题
感觉很简单,搞了近两个小时,写了下面的程序
public class Solution { /** * @param strs: A list of strings * @return: A list of strings */ public List<String> anagrams(String[] strs) { // write your code here List<String> list = new ArrayList<String>(); if(strs.length == 0 || strs ==null) return list; int i=0; int j=0; int k = -1; while(i<strs.length ){ while(j< strs.length ){ if(compare(strs[i],strs[j])){ k=i; break; }else{ j++; } } if(k==i) break; i++; } if(k==-1) return list; list.add(strs[k]); for( i=0;i<strs.length ;i++) if(i!=k && compare(strs[k],strs[i])) list.add(strs[i]); return list; } public boolean compare(String str1,String str2){ HashMap<Character,Integer> map = new HashMap<Character,Integer>(); if(str1.length()!= str2.length()) return false; for(int i=0;i<str1.length();i++){ char ch = str1.charAt(i); if(!map.containsKey(ch)){ map.put(ch,1); }else{ map.put(ch,map.get(ch)+1); } } for(int j=0;j<str2.length();j++){ char ch = str2.charAt(j); if(!map.containsKey(ch)){ return false; }else{ map.put(ch,map.get(ch)-1); if(map.get(ch)<0) return false; } } return true; } }
然而可以有多个
输入 ["tea","","eat","","tea",""] 输出 ["eat","tea","tea"] 期望答案 ["","","","eat","tea","tea"]
简书给的程序很好,或者说作者很会想,把由相同字母组成的单词映射到同一个key值
这里,对单词排序后,统计出现的次数,也是让映射的key值唯一
programcreek 也是排序的方法
Java
public class Solution { /** * @param strs: A list of strings * @return: A list of strings */ public List<String> anagrams(String[] strs) { // write your code here List<String> list = new ArrayList<String>(); if(strs == null || strs.length ==0) return list; Map<String,Integer> map = new HashMap<String,Integer>(); String[] strs2 = new String[strs.length]; for(int i=0;i< strs.length;i++){ char[] ch = strs[i].toCharArray(); Arrays.sort(ch); strs2[i] = String.valueOf(ch); if(!map.containsKey(strs2[i])){ map.put(strs2[i],1); }else{ map.put(strs2[i],map.get(strs2[i]) + 1); } } for(int i=0;i<strs.length;i++){ if(map.get(strs2[i]) >1) list.add(strs[i]); } // if(strs.length >=6) // System.out.println(0); return list; } }