字母异位词分组(49)
题目要求
给你一个String类型数组 元素均为小写字母 将元素之间为字母异位词 的元素 作为一个集合
例子
["eat","tae","bac","cba","d"]
"eat"中有e,a,t "tae"中有e,a,t 两元素中每个字母出现的数量相同 字母次序不同 互为 字母异位词 将这两个字符串加入同一个集合中
...
最终返回的集合为
[["eat","tae"],["bac","cba"],["d"]]
思路
找到数组strs中互为字母异位词的元素
1.我打算统计一个字符串中 每个字母出现的次数 一个字符串出现的字母种类为26种
"aabbcc" 'a','b','c'各出现2次
定义一个char类型的数组c 用来记录一个字符串中每种字母出现的次数 之后将char[]再转为string
2.值得注意的是:数组元素的长度范围[0,100] 即 某种情况下 一个元素长度为100且里面只有一种字母 此时需要注意char[]中 统计每种字母出现次数的方法
2.1 我当前采用的方法是,定义char[]时 char[] c = new char[26]
每个下标对应一种字母
Arrays.fill(c,'0') //每个字符 初始化为'0'
遍历strs中每个元素的每个字符时 如果char[]中对应的下标为'0'
则赋值为'a'
如果不为'0' 则 ++当前字符 所得值 赋给当前字符
//strs[i]charAt(j) - 'a' 字符 - 'a' 得到 int类型的值 对应char[] 元素 下标
if (chars[strs[i].charAt(j) - 'a'] == '0') {
chars[strs[i].charAt(j) - 'a'] = 'a';
} else {
char c = ++chars[strs[i].charAt(j) - 'a'];
chars[strs[i].charAt(j) - 'a'] = c;
}
2. 上述操作 获得了strs中每个元素 对应的char[]
将char[]转成string
3. 此时 你同时拥有strs[i] 和 其对应的 统计字符出现次数的string类型 s
建立一个map来存储对应的关系
key = 统计该字符出现次数的string类型的 s
value 为List<String> List中存放strs的元素 str
4. 实现细节
4.1如果在map中查找不到s 说明 s对应的strs元素 还没有字母异位词集合
建立一个List<String> 将strs的元素 str放入list
在map中插入一个键值对 map.put(s,list)
4.2如果在map中查找到s 说明此时 map中已经有 str的字母异位次集合
根据s获取到集合,将str加入集合,更新键值对
5.获取到map中所有的value(集合)并返回
实现
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
//遍历数组中每个字符串
for (int i = 0; i < strs.length; i++) {
String str = "";
//初始化一个数组 元素值为'0'
char[] chars = new char[26];
Arrays.fill(chars, '0');
//遍历字符串的每个字符
for (int j = 0; j < strs[i].length(); j++) {
if (chars[strs[i].charAt(j) - 'a'] == '0') {
chars[strs[i].charAt(j) - 'a'] = 'a';
} else {
char c = ++chars[strs[i].charAt(j) - 'a'];
chars[strs[i].charAt(j) - 'a'] = c;
}
}
//将char数组中每个元素 拼接为一个字符串
for (int j = 0; j < chars.length; j++) {
str += chars[j];
}
if (map.get(str) == null) {
List<String> list = new ArrayList<>();
list.add(strs[i]);
map.put(str, list);
} else {
List<String> list = map.get(str);
list.add(strs[i]);
map.put(str, list);
}
}
List<List<String>> answers = new ArrayList<>();
answers.addAll(map.values());
return answers;
}
}