题目

 乱序字符串

给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中。

样例

对于字符串数组 ["lint","intl","inlt","code"]

返回 ["lint","inlt","intl"]

注意

所有的字符串都只包含小写字母

解题

感觉很简单,搞了近两个小时,写了下面的程序

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;
    }
}
Java Code

然而可以有多个

输入
["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;
    }
}
Java Code