49. 字母异位词分组

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

示例:

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

说明:

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

 

代码1:

import java.util.Arrays;
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
      var list =new ArrayList<List<String>>();
      var array=new ArrayList<String>();
      array.add(strs[0]);
      list.add(array);
      for(int i=1;i<strs.length;i++){
          boolean bl=false;
          for(int j=0;j<list.size();j++){
             if(match(list.get(j).get(0),strs[i])){
                list.get(j).add(strs[i]);
                bl=true;
                break;
             }
          }
          if(bl){continue;}
          array=new ArrayList<String>();
          array.add(strs[i]);
          list.add(array);
      }
      return list;
    }
    //match方法比较串是否含有相同字符 先转换成数组(字符/字节),再对数组排序,再比较数组
    public static boolean match(String arr,String str){
      if(arr.length()!=str.length()){return false;}
      byte[] b1=arr.getBytes();
      byte[] b2=str.getBytes();
      Arrays.sort(b1);
      Arrays.sort(b2);
      return Arrays.equals(b1,b2);
    }
}

代码2:

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
         HashMap<String,ArrayList<String>> map=new HashMap<String,ArrayList<String>>();
         for(String str:strs){
             char[] ch= str.toCharArray();
             Arrays.sort(ch);
             String key=String.valueOf(ch);
             if(!map.containsKey(key)){
                 map.put(key,new ArrayList<String>());
             }
            map.get(key).add(str);
         }
         return new ArrayList(map.values());
    }
}

 

 方法三:26个英文字母分别对应一个质数,求每个String的乘积,乘积相同就是异位词。

 

 

posted @ 2020-12-19 17:46  堤苏白  阅读(128)  评论(0)    收藏  举报