【力扣】242.有效的字母异位词|每日一题|刷题打卡

65 阅读1分钟

一、题目描述

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

注意: 若 s 和 t **中每个字符出现的次数都相同,则称 s 和 t **互为字母异位词。

示例 1:

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

示例 2:

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

二、思路分析

  1. 分别遍历两个对象,存储对应的字符以及字符出现的次数
  2. 然后比较两者的次数是否相等

三、代码答案

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function (s, t) {
  if (s.length !== t.length) return false
  const mp = {}
  const mp2 = {}
  for (var i = 0; i < s.length; i++) {
    if (mp[s[i]]) {
      mp[s[i]]++
    } else {
      mp[s[i]] = 1
    }
  }
  for (var i = 0; i < t.length; i++) {
    if (mp2[t[i]]) {
      mp2[t[i]]++
    } else {
      mp2[t[i]] = 1
    }
  }
  const arr = Object.keys(mp)
  for (var n = 0; n < arr.length; n++) {
    if (mp[arr[n]] !== mp2[arr[n]]) return false
  }
  return true
};

优化版本

  1. 只使用一个对象:来记录字符出现的次数,而不需要两个对象。在遍历字符串 s 和 t 的过程中,对于字符串 s 中的字符,递增对应的计数器;对于字符串 t 中的字符,递减对应的计数器。最后,如果对象中所有键值对的值都为 0,则两个字符串为字母异位词
  2. 使用 Map 数据结构:可以更方便地操作键值对,避免使用 Object.keys 方法
/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function (s, t) {
if (s.length !== t.length) return false;

  const counter = new Map();

  for (var i = 0; i < s.length; i++) {
    counter.set(s[i], (counter.get(s[i]) || 0) + 1);
    counter.set(t[i], (counter.get(t[i]) || 0) - 1);
  }

  for (const count of counter.values()) {
    if (count !== 0) return false;
  }

  return true;
};