LeetCode 242 有效的字母异位词(JAVA)

LeetCode 242 有效的字母异位词(JAVA)

一、题目描述:

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

二、题目分析:

该问题针对的是数组对象。由于题目已经明确只包含小写字母,则无需考虑其他字符的情况。
字母异位词的含义为两个字符串的字符出现次数相同,则互为字母异位词。如'anagram'与'nagaram'.
这里我考虑采用map,通过键值对的形式记录下字符串中的字符与出现次数,然后在比较两个map是否一致。

三、开始作答:

class Solution {
    public boolean isAnagram(String s, String t) {

        Map<Character,Integer> mapA = new HashMap<>();
        Map<Character,Integer> mapB = new HashMap<>();
		//计算s的字符和次数
        for(int i = 0; i< s.length();i++){
            mapA.put(s.charAt(i),mapA.getOrDefault(s.charAt(i),0) + 1);
        }
		//计算t的字符和次数
        for(int i = 0; i< t.length();i++){
            mapB.put(t.charAt(i),mapB.getOrDefault(t.charAt(i),0) + 1);
        }
		//判断是否相等
        if(mapA.equals(mapB)){
            return true;
        }else{
            return false;
        }

    }
}

四、查看题解:

看完题解后,发现自己有点呆,直接通过数组就能完成。同时也忽略了一些特判。

1.首先判断两个字符串数组是否相等,如果不相等那必然不是字母异位词。
2.初始化字母哈希表,遍历s和t.这一步申请的空间根据字母表大小申请,控制数组大小。
3.s在对应的位置增加,t在对应的位置减少,最后哈希表每个值都为0,则说明是字母异位词。
class Solution {
    public boolean isAnagram(String s, String t) {
        //特判
        if(s.length() != t.length()){
            return false;
        }
        //初始化哈希表
        int[] hash = new int[26];

        for(int i = 0; i<s.length();i++){
            //遍历s字符串,在对应位置计数
            hash[s.charAt(i) - 'a'] ++;
            //遍历t字符串,在对应位置减去计数
            hash[t.charAt(i) - 'a'] --;
        }

        //最后判断hash表的每一个值是否都为0,如果为0则为字母异位词
        for(int i = 0; i< 26; i++){
            if(hash[i] != 0){
                return false;
            }

        }
        return true;
    }
}

这个是优化后的版本。

posted @ 2024-03-19 15:17  陆黎  阅读(17)  评论(0编辑  收藏  举报