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;
}
}
这个是优化后的版本。