LeetCode算法学习之--HashMap--有效的字母异位词

232 阅读1分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

大家好今天给大家分享下一道 LeetCode 简单难度 的题目[有效的字母异位词](leetcode-cn.com/problems/tr…)

题目

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

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

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

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

分析

1.字母异位词语,

1.字母出现的次数必须相同

2.字母都是小写词语

3.字符串的长度可能不同

4.如果是返回true,如果不是返回false

解法

1暴力排序

2.hashMap

解法一:暴力

思路
1.先sort
2.迭代逐一比较

*/
var isAnagram = function (s, t) {
  // 字符串先排序
  const sArr = s.split("");
  const tArr = t.split("");

  //   如果长度不一样 肯定是false
  if (tArr.length !== sArr.length) {
    return false;
  }
  //   分别排序
  sArr.sort((a, b) => {
    return a.localeCompare(b);
  });
  tArr.sort((a, b) => {
    return a.localeCompare(b);
  });

  for (let i = 0; i < sArr.length; i++) {
    if (tArr[i] !== sArr[i]) {
      // 如果不一样则返回false
      return false;
    }
  }

  return true;
};

/* 复杂度
时间 O(nlogn) 迭代是N sort是logN
空间 O(1)
*/

解法二:hashMap

思路
1.hashMap统计字母出现次数
2.一旦发现统计的次数小于0 则表明一定是false,因为在字符串字母相同的情况下,
额外多一个字符就会导致少一个其他的字符
*/

var isAnagram = function (s, t) {
  const map = new Map();

  //   如果长度不一样 肯定是false
  if (t.length !== s.length) {
    return false;
  }

  for (const char of s) {
    if (map.has(char)) {
      map.set(char, map.get(char) + 1);
    } else {
      map.set(char, 1);
    }
  }
  for (const char of t) {
    if (!map.has(char)) {
      return false;
    }

    map.set(char, map.get(char) - 1);
    if (map.get(char) < 0) {
      return false;
    }
  }

  return true;
};

/* 复杂度
时间 O(n)
空间 O(n)
*/

总结

这道题考察的对 对HashMap的使用,进行统计重复字符,因为hashmap的查询复杂度是O(1)所以可以很好的降低时间复杂度

当然也可以sort之后再逐一比较

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com