给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次。
我的思路是先写个判断两个字符串是否是字母异位词,然后再遍历数组中所有的字符串
代码如下:
public class Solution { public List<List<String>> groupAnagrams(String[] strs) { List<List<String>> res = new ArrayList<>(); boolean visited[] = new boolean[strs.length]; for (int i = 0; i < visited.length; i++) { visited[i] = false; } for (int i = 0; i < strs.length; i++) { if (!visited[i]){ List<String> combine = new ArrayList<>(); combine.add(strs[i]); visited[i] = true; for (int j = 0; j < strs.length; j++) { if (visited[j]){ continue; } if (isEqu(strs[i],strs[j])){ combine.add(strs[j]); visited[j] = true; } } res.add(new ArrayList<>(combine)); } } return res; } public boolean isEqu(String a,String b){ if (a.length() != b.length()){ return false; } Set<Character> setA = new HashSet<>(); Set<Character> setB = new HashSet<>(); for (int i = 0; i < a.length(); i++) { setA.add(a.charAt(i)); } for (int i = 0; i < b.length(); i++) { setB.add(b.charAt(i)); } if (!setA.equals(setB)){ return false; }else{ int sum = 0; for (int i = 0; i < a.length(); i++) { sum += a.charAt(i) - b.charAt(i); } if (sum == 0){ return true; }else{ return false; } } } }
问题:
力扣好像刻意不让我用暴力破解,
官方给出的方法是由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。
代码如下:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<String, List<String>>();
for (String str : strs) {
char[] array = str.toCharArray();
Arrays.sort(array);
String key = new String(array);
List<String> list = map.getOrDefault(key, new ArrayList<String>());
list.add(str);
map.put(key, list);
}
return new ArrayList<List<String>>(map.values());
}
}