开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天,点击查看活动详情
242.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = "anagram", t = "nagaram" 输出: true
示例 2: 输入: s = "rat", t = "car" 输出: false
说明: 你可以假设字符串只包含小写字母。
思路
数组其实就是一个简单的哈希表没在这道题目中,字符串只有小写字母,所以就可以用一个简单的数组来记录字符串里字符出现的次数。
思路很简单,先将s中存在的字母在数组中对应的位置都加一,然后在将t中存在的字母在数组中所对应的位置都减一,这时遍历数组,如果s和t能一一对应,那么数组其实是没有变化的,所有元素依然都为0,但是如果s和t有不一样的字母,那么数组中肯定不是全为零的,我们只要遍历到有一个元素不为零,就可以直接返回false。
什么时候用数组、set、map
- 数组:哈希值比较小,范围可控(较小)时,用数组。
- set:数值很大就用set
- map:如果k对应value就用map
解法
class Solution {
public boolean isAnagram(String s, String t) {
int[] hash=new int[26];
for(int i=0;i<s.length();i++){
hash[s.charAt(i)-'a']++;
}
for(int i=0;i<t.length();i++){
hash[t.charAt(i)-'a']--;
}
for(int i=0;i<hash.length;i++){
if(hash[i]!=0) return false;
}
return true;
}
}
然后又用js做了一遍,思路是一样的,但是注意js中获取ACSII码的写法"a".charCodeAt()
,以及直接在关于t的循环中判断是否符合条件,这里很巧妙,因为上来给hash数组所有元素都赋值为0,如果s中没有这个字母,那么hash[i]就是0,此时可以直接判断出来s中没有这个字母,所以就不对了,可以直接return false
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if(s.length != t.length) return false;
const hash=new Array(26).fill(0);
for(const i of s){
hash[i.charCodeAt()-"a".charCodeAt()]++;
}
for(const i of t){
if(!hash[i.charCodeAt()-"a".charCodeAt()]) return false;
hash[i.charCodeAt()-"a".charCodeAt()]--;
}
return true;
};