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.
题目:在一个字符串数组里面分类,有相同字母的放在同一个list。
思路:遍历每一个元素,然后和已存在的相比较,如果字母都相同,就放一起,否则开辟一个新的list。自己的这个解法提交超时,每次遇到新的字符串都要把已存在的都遍历一遍。
public List<List<String>> groupAnagrams(String[] nums) {
List<List<String>> result = new ArrayList<List<String>>();
result.add(new ArrayList<String>());
for(int i = 0; i < nums.length;i++) {
List<List<String>> current = new ArrayList<List<String>>();
boolean flag = true;
for(List<String> l : result) {
if(l.isEmpty()) {//如果是空的,把第一个放进去。
l.add(nums[i]);
ArrayList<String> temp = new ArrayList<>(l);
current.add(temp);
flag = false;
} else {
if(isSame(nums[i], l.get(0))){//判断是否相同,如果是,就加入已存在的list
l.add(nums[i]);
ArrayList<String> temp = new ArrayList<>(l);
current.add(temp);
flag = false;
}
}
}
if (flag) {//如果不相同,则开辟一个新的list来存放
ArrayList<String> temp = new ArrayList<>();
temp.add(nums[i]);
if (!current.contains(temp)) {
current.add(temp);
}
}
if(!result.containsAll(current)) {
result.addAll(current);
}
}
return result;
}
public boolean isSame(String s1, String s2) {//判断两个字符串元素是否一样
char[] str1 = s1.toCharArray();
char[] str2 = s2.toCharArray();
Arrays.sort(str1);
Arrays.sort(str2);
String st1 = String.valueOf(str1);
String st2 = String.valueOf(str2);
if( st1.equals(st2)) {
return true;
} else {
return false;
}
}
思路二:这是参考网友的做法,很简洁,用到了map,根据字符做key,key相同的就放一起。
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList<List<String>>();
HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
for(String str: strs){
char[] arr = new char[26];
for(int i=0; i<str.length(); i++){
arr[str.charAt(i)-'a']++;
}
String ns = new String(arr);
if(map.containsKey(ns)){
map.get(ns).add(str);
}else{
ArrayList<String> al = new ArrayList<String>();
al.add(str);
map.put(ns, al);
}
}
result.addAll(map.values());
return result;
}