数据结构与算法之有效的字母异位词

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

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

题目解析:

先对两个字符串进行长度判断,若不相等则一定不是字母异位词

解法一:可以先将s字符串出现的字母放入hashMap中,键存放字母,值存放出现字数,然后再遍历t进行对比

解法二:可以像赎金信的解法差不多,用一个数组记录26字母在s中出现的次数,然后再遍历t进行对比

解法三:将两个字符串放入字符数组中,并进行排序,然后进行值比较

(注意:不能使用 字符数组.equals(字符数组),因为数组是对象,这样是进行内存地址比较,要使用Arrays类重写的静态方法equals() )

方法一:

class Solution {
   public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()){
            return false;
        }
        Map<Character,Integer> map = new HashMap<>();
        for (int i = 0; i <s.length() ; i++) {
            if (map.containsKey(s.charAt(i))){
                map.put(s.charAt(i),map.get(s.charAt(i))+1);
            }else {
                map.put(s.charAt(i),1);
            }
        }

        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 {
                return false;
            }
        }
        
        return true;
    }
}

运行结果:

 方法二:

class Solution {
   public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()){
            return false;
        }
        int[] arr = new int[26];
        for (int i = 0; i <s.length() ; i++) {
            int suoyin = s.charAt(i) - 'a';
            arr[suoyin]++;
        }
        for (int i = 0; i <t.length() ; i++){
            int suoyin2 = t.charAt(i) - 'a';
            if (arr[suoyin2]>0){
                arr[suoyin2]--;
            }else {
                return false;
            }
        }
        return true;
    }
}

运行结果:

方法三:

class Solution {
   public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()){
            return false;
        }
        char[] sArray = s.toCharArray();
        char[] tArray = t.toCharArray();
        Arrays.sort(sArray);
        Arrays.sort(tArray);
        /*
        //错误,此处进行的是内存地址比较,而不是值比较
        // == 也是进行内存地址比较
        if (sArray.equals(tArray)){
            return true;
        }
        return false;
        */
        return Arrays.equals(sArray,tArray);
    }
}

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值