LeetCode:49. 字母异位词分组(哈希表)

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

说明:

所有输入均为小写字母。
不考虑答案输出的顺序。


【思路】:

利用Ascii码排序。


评论区非常棒的一个代码:(简洁易懂)

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        HashMap<String,ArrayList<String>> map=new HashMap<>();
        for(String s:strs){
            char[] ch=s.toCharArray();
            Arrays.sort(ch);
            String key=String.valueOf(ch);
            if(!map.containsKey(key))    map.put(key,new ArrayList<>());
            map.get(key).add(s);
        }
        return new ArrayList<List<String>>(map.values());
    }
}

我的代码(显得太过冗长了,而且最后两个测试点超时过不了)
没想到直接把HashMap设为<String, ArrayList>类型的来用。
其实两个代码表现的思想是完全一样的。

class Solution {
    //key = 字符串的值;  value = 字符串按Ascii码排好序的值
    Map<String, String> hash = new HashMap<String, String>();
    //再用一个哈希表,记录每个字符串出现的个数
    Map<String, Integer> hashNum = new HashMap<String, Integer>();
    
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> res = new ArrayList<List<String>>();
        //遍历字符串
        for(int i = 0;i < strs.length;i++){
            //转char数组
            char [] arr = strs[i].toCharArray();
            //--------更新本字符串出现的次数--------
            if(hashNum.containsKey(strs[i])){
                //得到出现次数
                int cnt = hashNum.get(strs[i]);
                hashNum.put(strs[i], cnt + 1);
            }else{
                hashNum.put(strs[i], 1);
                //-----------------------------------
                //排个序
                Arrays.sort(arr);
                //取出字符串排好序后的值
                String temp = String.valueOf(arr);
                //加到hash表中
                hash.put(strs[i], temp);
            }
        }
        //遍历哈希表,找出value相同的  
        for(Map.Entry<String, String> e : hash.entrySet()) {
			String key = e.getKey();
            String value = e.getValue();
            //得到res的迭代器
            Iterator<List<String>> it = res.iterator();
            //表示是否找到该字符串放的位置
            boolean ok = false;
            //只要res里面还有链表
            while(it.hasNext() && !ok){
                //子链表
                List<String> list = it.next();
                //取出链表里面得一个元素,看看两者的value是否相等
                String headValue = hash.get(list.get(0));
                //如果两者value相等,那么把key这个字符串加到该链表中;注:这里用eauals方法对比
                if(value.equals(headValue)){
                    int cnt = hashNum.get(key);
                    for(int i = 1;i <= cnt;i++){
                        list.add(key);   
                    }
                    //找到位置
                    ok = true;
                }
            }
            //如果到这里ok仍然是false;那么说明要新添加一个链表了
            if(ok == false){
                List<String> list = new ArrayList<String>();
                //出现次数获得一下
                int cnt = hashNum.get(key);
                //根据出现次数来添加进去
                for(int i = 1;i <= cnt;i++){
                    list.add(key);   
                }
                res.add(list);
            }
		}
        return res;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值