242. 有效的字母异位词

题目描述:

给定两个字符串 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 仅包含小写字母

 法一:通过题目描述和示例可以得出,如果字符串t是字符串s的字母异位词,那么s和t在按照字母表升序排序后应该是相等的。所以我们可以分别对这两个字符串排序,再对排完序后的两字符串进行比较就能达到题目的要求。

class Solution {
       public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {   //如果两字符串的长度不相等,则一定不是彼此的异位词     
            return false;
        }

        char[] str1 = s.toCharArray();
        char[] str2 = t.toCharArray();

        Arrays.sort(str1);
        Arrays.sort(str2);

        return Arrays.equals(str1, str2);
    }

}

法二:考虑到如果t是s的异位词,那么 t 和 s 中出现的字符种类和次数是相同的,所以我们可以维护一个长度为26的数组counts,用于保存字符串中各个字符出现的次数。为了节省空间,可以在遍历字符串 s 的时候填充完整该数组,那么在遍历完成时该数组就保存了字符串 s 中出现的字符以及所出现字符的个数。接着就可以在遍历字符串 t 的时候对照该数组 counts 进行相应位置的递减操作,即拿着该数组去遍历字符串 t , 每遍历 t 中的一个字符,就去数组counts中找对应的元素值并做递减操作。这样一来,如果 t 是 s 的字母异位词, 那么在 t 遍历结束时counts中的所有元素值都应为零,否则 t 不是 s 的字母异位词。

class Solution{
    public boolean isAnagram(String s, String t){
        int[] counts = new int[26];   //声明和初始化一同进行(动态初始化)
        for(char c : s.toCharArray()){
            counts[c - 'a']++;
        }

        for(char c : t.toCharArray()){
            counts[c - 'a']--;
        }

        for(int i : counts){
            if(i != 0)
             return false;
        }

        return true;
    }
}

       在上述遍历字符串 s 和 t 的过程中,我们是先把字符串转换为了字符数组,再用增强for循环完成的遍历,当然也可以直接对字符串的构成字符进行遍历,这就要用到charAt() 函数了。在Java中String类有一个返回某个索引处的字符的函数: char charAt(int index)

所以上述遍历字符串的部分也可以写成:

for(int i = 0; i < s.length(); i++){
  
     counts[s.charAt(i) - 'a']++;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值