字母异位词分组(49)

字母异位词分组(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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值