这个题目我是直接看的答案,其实考察的就是我们如何来表达两个词确实是异位词:
- 首先要保证长度相等
- 其次就要保证每个字符出现的次数一样
所以我们主要还是从第二点出发。如下
1. 将字符串中字符排序重组
这个思路就是对于一个字符串里的所有字符进行排序然后重组,那异位词肯定是相同的。代码如下:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if (strs.length == 0) return new ArrayList();
Map<String, List> ans = new HashMap<String, List>();
for (String s : strs) {
char[] ca = s.toCharArray();
Arrays.sort(ca); //排序,并得到排序后的key
String key = String.valueOf(ca);
//看看此key有没有了,没有则加一个
if (!ans.containsKey(key)) ans.put(key, new ArrayList());
ans.get(key).add(s);
}
return new ArrayList(ans.values()); //有一个方法,是map.values()
}
}
2.将每个字符的次数记录下来,组成一个唯一的字符串
也就是说例如bcb的次数可以记为[0,2,1,…],而cbb的次数也可以[0,2,1,…],这样他们就相等了,代码如下:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if (strs.length == 0) return new ArrayList();
Map<String, List> ans = new HashMap<String, List>();
int[] count = new int[26]; //这个记录每个字符出现的次数
for (String s : strs) {
Arrays.fill(count, 0); //每次归零
for (char c : s.toCharArray()) count[c - 'a']++; //记录各个次数
StringBuilder sb = new StringBuilder(""); //根据次数构建一个唯一字符串
for (int i = 0; i < 26; i++) {
sb.append('#');
sb.append(count[i]);
}
String key = sb.toString(); //同样根据这个字符串去字典里找
if (!ans.containsKey(key)) ans.put(key, new ArrayList());
ans.get(key).add(s);
}
return new ArrayList(ans.values());
}
}
答案参考的是leetcode官方题解,但思路上不算难。