题目:
Given an array of strings, group anagrams together.
For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Return:
[ ["ate", "eat","tea"], ["nat","tan"], ["bat"] ]
Note: All inputs will be in lower-case.
分析1(推荐-参考算法):class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//anagrams:颠倒字母而成的字
//给定字符串数组,匹配其中相同组成的子串,其中输入均为小写
//思路:使用HashMap实现
if(strs.length==0||strs==null){
return new ArrayList<List<String>>();
}
Map<String,List<String>> map=new HashMap<String,List<String>>();
for(String str:strs){
char [] ch=str.toCharArray();
Arrays.sort(ch);
String keyStr=String.valueOf(ch);
if(!map.containsKey(keyStr)){
map.put(keyStr,new ArrayList<String>());
}
map.get(keyStr).add(str);
}
return new ArrayList<List<String>>(map.values());
}
}
分析2(数组长度太长时间超时-原创算法):
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//anagrams:颠倒字母而成的字
//给定字符串数组,匹配其中相同组成的子串,其中输入均为小写
//设定一个数组标识是否已经被访问过
//该方法适用于数组长度不是特别长的
List<List<String>> list=new ArrayList<>();
if(strs==null||strs.length==0)return list;
boolean [] flag=new boolean[strs.length];
for(int i=0;i<strs.length;i++){
List<String > subList=new ArrayList<>();
if(!flag[i]){
//未被访问过
subList.add(strs[i]);
for(int j=i+1;j<strs.length;j++){
if(!flag[j]&&equalStrings(strs[j],strs[i])){
subList.add(strs[j]);
//标志位置为true
flag[j]=true;
}
}
}
if(subList.size()!=0){
//防止添加空List子集
list.add(subList);
}
}
return list;
}
//比较两个字符串是否相等
public boolean equalStrings(String str1,String str2){
if(str1.length()!=str2.length()){
return false;
}
//排序
char [] ch1=str1.toCharArray();
char [] ch2=str2.toCharArray();
Arrays.sort(ch1);
Arrays.sort(ch2);
String newStr1=String.valueOf(ch1);
String newStr2=String.valueOf(ch2);
return newStr1.equals(newStr2);
}
}