LeetCode 242 有效的字母异位词 | 刷题打卡

195 阅读2分钟

题目描述

本文题目选取自 LeetCode 242. 有效的字母异位词

题目描述:

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例1:

输入: s = "anagram", t = "nagaram"
输出: true

示例2:

输入: s = "rat", t = "car"
输出: false

说明: 你可以假设字符串只包含小写字母。

思路

本题是一个简单题,主要解题思路是通过统计两个单词的字母和每个元素的出现次数,在 O(N) 次遍历内,我们可以得到想要的结果。统计的方法有很多,比如基于数组、基于 Map 等。

理解了主要思路之后,下面我们结合本题具体的代码,看看如何在代码中做优化。

题解

  • 排序后直接比较
var isAnagram = function (s, t) {
    if (s.length !== t.length) {
        return false;
    }
    let sortedA = [...s].sort();
    let sortedT = [...t].sort();
    return sortedA.every((a, i) => a === sortedT[i]);
};
  • 基于数组的桶计数并优化循环次数
var isAnagram = function (s, t) {
    if (s.length !== t.length) {
        return false;
    }
    let nums = new Array(26).fill(0);
    const A = 'a'.charCodeAt(0);
    for (let i = 0; i < s.length; i++) {
        nums[s.charCodeAt(i) - A]++;
        nums[t.charCodeAt(i) - A]--;
    }
    return nums.every(num => num === 0);
};
  • 基于字典统计并提前跳出循环比较
var isAnagram = function (s, t) {
    if (s.length !== t.length) return false;
    let map = {};
    for (let ch of s) {
        map[ch] ? map[ch]++ : map[ch] = 1
    }
    for (let ch of t) {
        if (!map[ch] || map[ch] <= 0) return false;
        map[ch]--;
    }
    for (let ch in map) {
        if (map[ch] !== 0) return false;
    }
    return true
};

总结

简单题也要仔细做! 题在精不在多,一题多解可以扩展自己的思路。

前期回顾

Leetcode303 区域和检索 | 刷题打卡

LeetCode 组合总和三连 | 刷题打卡

LeetCode 703 数据流中的第 K 大元素 | 刷题打卡

LeetCode 239 滑动窗口最大值 | 刷题打卡