给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
思路:依次遍历原数组中的字符串,找到一类字符串的所有异位词, 将其add入结果,并将这些已经添加的字符串删去,再从头遍历新的一类异位词,直至原数组遍历完毕
import java.util.ArrayList;
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res=new ArrayList<List<String>>();
if(strs==null||strs.length==0)
return res;
List<String> strlist=new ArrayList<String>(Arrays.asList(strs));
while(!strlist.isEmpty()){//当strlist全被去除,则检索完毕
List<String> temp=new ArrayList<String>();
String cur=strlist.get(0);
temp.add(cur);
strlist.remove(0);
for(int i=0;i<strlist.size();){//直至找到strlist中最后一个
String s=strlist.get(i);
if(same(cur,s)){
temp.add(s);
strlist.remove(i);//依次读取,找到是异位词的就从strlist中去除
}
else{
i++;
}
}
res.add(temp);
}
return res;
}
public static boolean same(String cur,String temp){
if(cur.length()!=temp.length()){
return false;
}
int[] num=new int[125];//新建数组用来计数字母,a的ASCII为97,z的ASCII为122
for(int i=0;i<cur.length();i++){
num[cur.charAt(i)]++;
}
for(int i=0;i<temp.length();i++){
num[temp.charAt(i)]--;
}
for(int i=0;i<num.length;i++){
if(num[i]!=0)//两次读取分别自增和自减,若最后数组有非零项则说明出现了不同元素
return false;
}
return true;
}
}