Letcode刷题计划

今天给大家带来一道java经典题目 异位词分组

二、示例

2.1> 示例 1:

输入】 strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出】 [["bat"],["nat","tan"],["ate","eat","tea"]]

2.2> 示例 2:

输入】 strs = [""]
输出】 [[""]]

2.3> 示例 3:

输入】 strs = ["a"]
输出】 [["a"]]

题目如上

思路

其实看到这个问题我第一次做脑海里面会有很多疑惑

比如 什么是异位词 怎么判断两个词是不是异位词等等

接下来 贴上详细解释

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。


示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false
 

提示:

1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母

明显看到  异位词 关键 字母相同 出现次数相同

知道这点我们就可以去着手实现了

思路:

这道题目要求你将给定的字符串数组分组,每组包含的都是字母异位词。所谓“字母异位词”是指在单词的字母重新排列之后可以得到另外一个单词。也就是说,如果两个单词有着相同的字母且每个字母出现的次数也相同,那么这两个单词就互为字母异位词。

这里不需要遍历每一个字母的所有可能组合,也不需要判断单词是否合法,因为题目已经提供了所有的单词,你只需要将它们分组。

对于示例 1,"eat", "tea", "ate"互为异位词,因为它们都包含相同的字母'e', 'a', 't'。同理,"tan"和"nat"是一组,因为它们都包含't', 'a', 'n'。而"bat"没有异位词,所以它单独成为一组。

这样的题目通常可以通过排序字符串中的字符来解决。对于每个单词,将它的字母按照字典顺序排序,然后所有排序后相同的单词就归为一组。这样,所有异位词都会拥有相同的排序字符串,这可以作为一个键值存储在哈希表中。

下面是一个解决这个问题的简单算法步骤:

  1. 创建一个哈希表,用来存储每一个排序后的单词和对应的字符串数组。
  2. 遍历给定的字符串数组,对于每一个字符串,将其按字母排序。
  3. 将排序后的字符串作为键,原始字符串作为值,存储到哈希表中。
  4. 最后,哈希表中的每个值就是一组异位词。

这里提供java 题解

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
    Map<String,List<String>>map=new HashMap();
    for(String str:strs)
    {
        char [] sc=str.toCharArray();
        Arrays.sort(sc);
        String  key=new String(sc);
        if(map.get(key)==null)
        {
            List list=new ArrayList();
            list.add(str);
            map.put(key,list);
            
        }
        //如果已经存在相同key 元素 即在后面追加
        else
        map.get(key).add(str);

    }
    return new ArrayList(map.values());
    }
}

结果

至此完结撒花 大家共勉

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一心向上的小奥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值