一、问题描述
- 给定一个字符串数组,按照同构词(相同字母组成的单词)分类。
- 例如,给定[“eat”, “tea”, “tan”, “ate”, “nat”, “bat”], 返回:[ [“ate”,”eat”,”tea”],[“nat”,”tan”],[“bat”] ]
二、解题思路
- 将字符串数组中的每个字符串转化为字符数组,将字符数组排序,然后比较两个字符数组中的元素是否完全相等,如果完全相等则是同构词,否则,不是同构词。
- 上面这种方式存在一个问题,时间负责度太大,超时。借用上面的思路,还是将字符串转化为字符数组并排序,借用HashMap,将排序后的字符数组转化为新字符串作为key,值即为一个list,里面存储键为key的原始字符串集合。
三、代码
- 采用第一种方式,三层循环
public class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if(strs==null || strs.length==0)
return new ArrayList<List<String>>();
List<List<String>> result=new ArrayList<List<String>>();
Set<Integer> count=new HashSet<Integer>();
for(int i=0;i<strs.length ;i++){
if(count.contains(i))
continue;
char[] temout=strs[i].toCharArray();
Arrays.sort(temout);
List<String> tem=new ArrayList<String>();
tem.add(strs[i]);
for(int j=i+1;j<strs.length;j++){
if(strs[i].length()!=strs[j].length() || count.contains(j))
continue;
char[] temin=strs[j].toCharArray();
Arrays.sort(temin);
boolean flag=true;
for(int k=0;k<temin.length;k++){
if(temin[k]!=temout[k]){
flag=false;
break;
}
}
if(flag){
tem.add(strs[j]);
count.add(j);
}
}
result.add(new ArrayList<String>(tem));
}
return result;
}
}
- 采用第二种方式环
public class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if(strs==null || strs.length==0)
return new ArrayList<List<String>>();
Map<String,List<String>> map=new HashMap<String,List<String>>();
for(String str :strs){
char[] chArray=str.toCharArray();
Arrays.sort(chArray);
String stringKey=String.valueOf(chArray);
if(!map.containsKey(stringKey)){
map.put(stringKey,new ArrayList<String>());
}
map.get(stringKey).add(str);
}
return new ArrayList<List<String>>(map.values());
}
}