LeetCode-49. Group Anagrams(Medium):
Given an array of strings, group anagrams together.
Example:
Input: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
Note:
- All inputs will be in lowercase.
- The order of your output does not matter.
我的解法:
我用正常做法发现最后一组数据过不了,超时,说明这道题有一些技巧,这是我的做法和结果:
class Solution {
List<List<String>> ans = new ArrayList<List<String>>();
List<String> map = new ArrayList<String>();
public List<List<String>> groupAnagrams(String[] strs) {
for(int i=0; i<strs.length; i++) {
int j;
for(j=0; j<ans.size(); j++) {
if(map.get(j).equals(sortString(strs[i]))) {
ans.get(j).add(strs[i]);
break;
}
}
if(j == ans.size()) {
List<String> tmp = new ArrayList<>();
tmp.add(strs[i]);
ans.add(tmp);
map.add(sortString(tmp.get(0)));
}
}
return ans;
}
public String sortString(String t) {
char[] tmp = t.toCharArray();
Arrays.sort(tmp);
String sortedT = new String(tmp);
return sortedT;
}
}
大神做法:
发现思路都是一样的,不同的是,我在比较一个字符串按照字母顺序排序后的序列是否在map数组中出现过时使用遍历map数组的方法,而人家使用Map(字典)来查找的,虽然不知道Map的查找实现机制是什么,总之比遍历快就对了。。。
public class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> list = new ArrayList<List<String>>();
int len = strs.length;
if(len<1) return list;
Map<String,List<String>> map = new HashMap<String,List<String>>();
String tmp = "";
for(int i=0;i<len;i++){
tmp = strs[i];
char[] arrayOfString = tmp.toCharArray();
Arrays.sort(arrayOfString);
tmp = new String(arrayOfString);
if(map.containsKey(tmp)){
map.get(tmp).add(strs[i]);
}else{
List<String> item = new ArrayList<String>();
item.add(strs[i]);
map.put(tmp, item);
}
}
for (List<String> value : map.values()) {
list.add(value);
}
return list;
}
}