题目要求
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.
将含有相同的字母但是排序可能不同的单词分类至不同的数组
思路一:不使用map(超时了)
这里利用了String的API方法toCharArray来对两个单词是否是相同字母组成的进行比较。但是效率较低。这里有重复的无效操作,例如获得当前数组的第一个值并重新计算其对应的有序char数组。而且比较两个char数组的方法造成了三圈循环,带来的O(n3)的时间复杂度
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new LinkedList<List<String>>();
L1:for(int i = 0 ; i < strs.length ; i++){
String temp = strs[i];
int tempLength = temp.length();
L2:for(int j = 0 ; j<result.size() ; j++){
List<String> currentList = result.get(j);
String currentString = currentList.get(0);
int currentStringLength = currentString.length();
if(currentStringLength>tempLength){
List<String> newResult = new ArrayList<String>();
newResult.add(temp);
result.add(j, newResult);
continue L1;
}else if (currentStringLength<tempLength){
continue L2;
}else{
if(isPermutation(currentString, temp)){
result.get(j).add(temp);
continue L1;
}
}
}
List<String> newResult = new ArrayList<String>();
newResult.add(temp);
result.add(newResult);
}
return result;
}
public boolean isPermutation(String s1, String s2){
if(s1.length() != s2.length()){
return false;
}
char[] s1array = s1.toCharArray();
Arrays.sort(s1array);
char[] s2array = s2.toCharArray();
Arrays.sort(s2array);
for(int i = 0 ; i<s1array.length ; i++){
if(s1array[i] != s2array[i]){
return false;
}
}
return true;
}
思路二:利用String.valueof
其实在这里利用Map会减少重复的生成char数组的过程。同时使用String.valueof()方法将char数组转化为String并利用String的API直接比较两个字符串是否相等。通过这种方法效率值提高了不少。
public List<List<String>> groupAnagrams2(String[] strs){
Map<String, List<String>> map = new HashMap<String, List<String>>();
for(String temp : strs){
char[] current = temp.toCharArray();
Arrays.sort(current);
String sortedTemp = String.valueOf(current);
if(!map.containsKey(sortedTemp)){
List<String> tempResult = new ArrayList<String>();
tempResult.add(temp);
map.put(sortedTemp, tempResult);
}else{
map.get(sortedTemp).add(temp);
}
}
return new ArrayList<List<String>>(map.values());
}
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。