Leetcode--49. 字母异味词分组

非 Y 不嫁゛ 提交于 2019-12-11 04:35:25

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]
说明:

所有输入均为小写字母。
不考虑答案输出的顺序。

方法一:   时间复杂度O(nk)  k是最长的字符串长度,n是字符串的数量

记录字符串中每个字母出现的次数,映射到哈希表中,如果两个字符串含有的字母相同且数量一致,则说明是一类

class Solution {
    public static List<List<String>> groupAnagrams(String[] strs) {
         List<List<String>> result = new ArrayList<List<String>>();
         boolean used[] = new boolean[strs.length];
         int i,j;
         for(i=0;i<strs.length;i++)
         {
             List<String> temp = null;
             if(used[i]!=true)  //used用来表示当前字符串是否已被添加过
             {
                 temp = new ArrayList<String>();
                 temp.add(strs[i]);
                 for(j=i+1;j<strs.length;j++)
                 {
                     if(used[j]==false&&equals(strs[i],strs[j])==true)
                     {
                         used[j] = true;
                         temp.add(strs[j]);
                     }
                 }
             }
             if(temp!=null)
             {
                 result.add(temp);
             }
         }
         return result;
        }
     public static boolean equals(String a,String b)
     {
         Map<Character,Integer> map = new HashMap<>();
         int i;
         for(i=0;i<a.length();i++)//将第一个字符串各字母的数量记录下来
         {
             if(map.containsKey(a.charAt(i)))
             {
                 map.put(a.charAt(i), map.get(a.charAt(i))+1);//如果已经有这个字母,那数量加一
             }
             else
             {
                 map.put(a.charAt(i), 1);/如果还没有这个字母,添加进去,数量置为1
             }
         }
         for(i=0;i<b.length();i++)  //比较字符串b和a含有的字母种类,数量是否一致
         {
             if(map.containsKey(b.charAt(i)))
             {
                 map.put(b.charAt(i), map.get(b.charAt(i))-1);//如果哈希表中有b的这个字母,那数量减一
             }
             else
             {
                 return false; //如果没有,说明两个就不是一类
             }
         }
         Set<Character> set = map.keySet();//最后哈希表中各值为0,说明是一类
         for(char c:set)
         {
             if (map.get(c) != 0) 
             {
                   return false;
             }
         }
        return true;
         
     }
}

方法二:

将每个字符串按照字母顺序排序,这样的话就可以把 eat,tea,ate 都映射到 aet。其他的类似。

class Solution {

    public List<List<String>> groupAnagrams(String[] strs) {

        HashMap<String, List<String>> hash = new HashMap<>();

            for (int i = 0; i < strs.length; i++) {

                char[] s_arr = strs[i].toCharArray();

                Arrays.sort(s_arr);//对当前字符串进行排序

                String key = String.valueOf(s_arr); //将排序后的字符串作为一个key

                if (hash.containsKey(key)) {

                    hash.get(key).add(strs[i]); //如果包含这个key,那添加进这个key对应的value

                } else {

                    List<String> temp = new ArrayList<String>();

                    temp.add(strs[i]);

                    hash.put(key, temp);//如果不包含,创建一个新的key,进行添加

                }

 

            }

            return new ArrayList<List<String>>(hash.values()); 

         

    }

}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!