给定两个字符串 s
和 t
,编写一个函数来判断它们是不是一组变位词(字母异位词)。
注意:若 s
和 t
中每个字符出现的次数都相同且字符顺序不完全相同,则称 s
和 t
互为变位词(字母异位词)。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
示例 3:
输入: s = “a”, t = “a”
输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s
andt
仅包含小写字母
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function (s, t) {};
题目分析
- 判断s和t的长度是否相等,若不相等,则s和t绝对不是变位词
- 判断s和t是否相等,若相等,则s和t中每个字符出现的次数相同且字符顺序完全相同,s和t不是变位词
- 若s和t不相等但长度相等,可以使用多种方法进行判断
下面介绍两种常见的实现方法:
方法一
- 搜集s字符串各个字符数量
- 遍历t字符串,递减数组各个字符数量
- 若有字符数量为负,则为无效,否则是有效
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function (s, t) {
if (s === t || s.length != t.length) {
return false;
}
let table = new Array(26).fill(0);
for (let i = 0; i < s.length; i++) {
table[s.charCodeAt(i) - "a".charCodeAt(0)]++;
}
for (let i = 0; i < t.length; i++) {
table[t.charCodeAt(i) - "a".charCodeAt(0)]--;
if (table[t.charCodeAt(i) - "a".charCodeAt(0)] < 0) {
return false;
}
}
return true;
};
方法二
我们可以对字符串 s 和 t 分别排序,看排序后的字符串是否相等。
var isAnagram = function (s, t) {
return (
s.length == t.length &&
s !== t &&
[...s].sort().join("") === [...t].sort().join("")
);
};
PS:面试题由 “前端面试题宝典(https://fe.ecool.fun/)” 整理和录入,未授权任何机构或其他刷题工具引用。推荐官网刷题,题库更全,题目答案不定时更新~