Leetcode题库 - 有效的字母异位词(java语言版)

题目描述:

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

示例 1:

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

示例 2:

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

说明:
你可以假设字符串只包含小写字母。

      本题第一种思路和上一篇博客:两数组的交集2很相似,可以参照上一篇博客:https://blog.csdn.net/weixin_37850160/article/details/88540203

     本题看题目很容易理解:什么是有效的字母异位数呢?就是两个字符串相等并且每个字符出现的次数都是一样的。这样的数就是有效的字母异位数。抓住这两点,这道题就很好理解。

      第一种思路:用哈希map存储第一个字符串,键为字符的值,值为字符出现的次数。遍历第二个字符串,判断每个字符是否出现在map中并且判断出现的次数是否一致,任意一项不满足则不是有效的字母异位数。当遍历完成时,则就是有效的字符异位数。

      第二种思路:这个思路很简单,就是把两个字符串声明为字符数组,然后排序两个字符数组,然后遍历比较即可,对应元素都相同则是有效的,对应元素不相同则是无效的。(假如这两个字符数组,是有效的字母异位词,则排序完后就是字符一模一样的两个数组,这样比较完肯定是有效的。)这种方法简单,时间复杂度也比较低。但推荐用第一种,可以学习map的相关用法,是很不错的方法。

      注意:这两种思路的前提都是:两个字符串都是相同长度,不同长度时直接输出false.

第一种思路:

  String s="anagram";
        String t="nagaram";
//          第一种方法用map存储第一个数组,key为数组元素,值为数组元素出现的次数。
        if (t.length ()!=s.length ()){
              System.out.println(s+"和"+t+"不是字母异位词");
         }else{
          Map<Character,Integer> map = new HashMap <> (  );
          for (int i =0;i<s.length ();i++){
//        将字符添加到map中,有就+1,没有就添加赋值,定义次数为1
              if (!map.containsKey ( s.charAt ( i ) )) {
                  map.put ( s.charAt ( i ) , 1 );
              }else {
                  map.put ( s.charAt ( i ), map.get ( s.charAt ( i ) )+1);
              }
          }
          System.out.println(map);
//        遍历数组二进行比较,看是否存在这个元素,并且次数是否相同
          for (int i = 0;i<t.length ();i++){
               if (map.containsKey (t.charAt ( i ))&&map.get ( t.charAt ( i ) )>0){
            map.put ( t.charAt ( i ),map.get ( t.charAt ( i ) ) -1);
               }else {
                   System.out.println(s+"和"+t+"不是有效的字母异位数");
               }
          }
          System.out.println ( s+"和"+t+"是字母异位词" );
    }

执行结果:

执行用时:

第二种方法:

   if (t.length ()!=s.length ()){
              System.out.println("不是字母异位词");
         }else {
            char[] chars1=s.toCharArray ( );
            char[] chars2=t.toCharArray ( );
//        重点先排序
            Arrays.sort ( chars1 );
            Arrays.sort ( chars2 );
//            遍历任意数组,进行比较
            for (int i= 0;i<chars1.length;i++){
                if (chars1[i]!=chars2[i]){
                    System.out.println(s+"和"+t+"不是有效的字母异位词");
                    break;
                }
            }
            System.out.println(s+"和"+t+"是有效的字母异位词");
        }

执行结果:

执行用时:

总结:这道题思路很明确,用到了map的相关用法,也学习到了更加简便的方法,多动多想,脑袋才不会生锈。

2019-3-14

      

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值