Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
想法是把这个输入的String数组的每个String元素按照其字符的ASCII码的和进行分类,每一个和对应一个ArrayList<String>,这个数组包含所有字符的ASCII码和相同的String。Anagrams只可能发生在这些ArrayList内部的元素中。之后再对每一个ArrayList的元素进行暴力一对一对的比较。
注意的点:
在第36到44行,判断String s1和s2已经确定是anagram以后,要有一个boolean数组来记录这两个String是否已经被放入最终结果了。如果是,那么就不再重复放入。比如说,输入的test是["aa", "aa", "aa"],那么返回也应该是["aa", "aa", "aa"]。如果没有上面的判断的话,按照这个算法返回值会变成["aa", "aa", "aa","aa", "aa", "aa"]。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class Solution {
public ArrayList<String> anagrams(String[] strs) {
Map<Integer, ArrayList<String>> map = new HashMap<Integer, ArrayList<String>>();
for(int i = 0; i < strs.length; i++){
int count = 0;
String string = strs[i];
for(int j = 0; j < string.length(); j++){
count += (int)string.charAt(j);
}
if(map.containsKey(count)){
map.get(count).add(string);
}
else{
ArrayList<String> array = new ArrayList<String>();
array.add(string);
map.put(count, array);
}
}
ArrayList<String> result = new ArrayList<String>();
Collection<ArrayList<String>> arrayCol = map.values();
for(ArrayList<String> array : arrayCol){
int N = array.size();
boolean[] isAdded = new boolean[N];
Arrays.fill(isAdded, false);
for(int i = 0; i < N - 1; i++){
String s1 = array.get(i);
for(int j = i + 1; j < N; j++){
String s2 = array.get(j);
if(isAnagram(s1, s2)){
if(isAdded[i] == false){
result.add(s1);
isAdded[i] = true;
}
if(isAdded[j] == false){
result.add(s2);
isAdded[j] = true;
}
}
}
}
}
return result;
}
public boolean isAnagram(String s1, String s2){
if(s1.length() != s2.length()) return false;
int[] array = new int[26];
Arrays.fill(array, 0);
for(int i = 0; i < s1.length(); i++){
int index1 = s1.charAt(i) - 'a';
int index2 = s2.charAt(i) - 'a';
array[index1] = array[index1] + 1;
array[index2] = array[index2] - 1;
}
for(int i = 0; i < 26; i++){
if(array[i] != 0) return false;
}
return true;
}
}

429

被折叠的 条评论
为什么被折叠?



