Fancy DSA Fancy DSA
数据结构
算法
LeetCode
  • 关于
  • 导航 (opens new window)
  • 分类
  • 标签
  • 归档
设计模式 (opens new window)
博客 (opens new window)
GitHub (opens new window)

Jonsam NG

想的更多,也要想的更远
数据结构
算法
LeetCode
  • 关于
  • 导航 (opens new window)
  • 分类
  • 标签
  • 归档
设计模式 (opens new window)
博客 (opens new window)
GitHub (opens new window)
  • 开始上手
  • Plan 计划
  • Roadmap 路线
  • 算法简介
  • Sort 排序

  • Search 搜索

  • Recursive 递归

  • Graph 图

  • Tree 树

  • Math 数学

  • Hash 哈希

  • String 字符串

    • AlphaNumericPalindrome [回文串]
    • AlternativeStringArrange [交替合并字符串]
    • BoyerMoore [博耶-穆尔字符串搜索算法、BM 算法]
    • CheckAnagram [易位构词]
      • 介绍
      • 实现
      • 参考
    • NamingConvention [命名规则]
    • CheckExceeding [Exceeding words]
    • CheckPangram [全字母句]
    • CheckWordOccurrence [单词计数]
    • CountVowels [元音字母计数]
    • CreatePermutations [全排列]
    • DiceCoefficient [Dice系数]
    • FormatPhoneNumber [格式化电话号码]
    • GenerateGUID [生成GUID、UUID]
    • HammingDistance [汉明距离]
    • KMPPatternSearching [KMP字符串匹配]
  • BitManipulation 位操纵

  • Backtracking 回溯

  • DynamicProgramming 动态规划

  • Cache 缓存

  • Array 数组

  • Ciphers 密码学

  • Conversions 转换

  • ProjectEuler 欧拉计划

  • 其他

  • 算法
  • String 字符串
jonsam
2022-09-26
目录

CheckAnagram [易位构词]

# 介绍

易位构词游戏的英文词汇是 anagram,易位构词是一类文字游戏(更准确地说是一类 “词语游戏”),是将组成一个词或短句的字母重新排列顺序,原文中所有字母的每次出现都被使用一次,这样构造出另外一些新的词或短句。

# 实现

# JavaScript

// An [Anagram](https://en.wikipedia.org/wiki/Anagram) is a string that is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once. Anagram check is not case-sensitive;
/**
 * @function checkAnagramRegex
 * @param {string} str1
 * @param {string} str2
 * @returns {boolean}
 * @description - check anagram with the help of Regex
 * @example - checkAnagramRegex('node', 'deno') => true
 * @example - checkAnagramRegex('Eleven plus two', 'Twelve plus one') => true
 */
const checkAnagramRegex = (str1, str2) => {
  // check that inputs are strings.
  if (typeof str1 !== 'string' || typeof str2 !== 'string') {
    throw new TypeError('Both arguments should be strings.')
  }

  // If both strings have not same lengths then they can not be anagram.
  if (str1.length !== str2.length) {
    return false
  }

  /**
   * str1 converted to an array and traverse each letter of str1 by reduce method
   * reduce method return string which is empty or not.
   * if it returns empty string '' -> falsy, with Logical !(NOT) Operator, it's will be converted to boolean and return true else false
   */
  return ![...str1].reduce(
    (str2Acc, cur) => str2Acc.replace(new RegExp(cur, 'i'), ''), // remove the similar letter from str2Acc in case-insensitive
    str2
  )
}

/**
 * @function checkAnagramMap
 * @description - check anagram via using HashMap
 * @param {string} str1
 * @param {string} str2
 * @returns {boolean}
 * @example - checkAnagramMap('node', 'deno') => true
 * @example - checkAnagramMap('Eleven plus two', 'Twelve plus one') => true
 */
const checkAnagramMap = (str1, str2) => {
  // check that inputs are strings.
  if (typeof str1 !== 'string' || typeof str2 !== 'string') {
    throw new TypeError('Both arguments should be strings.')
  }

  // If both strings have not same lengths then they can not be anagram.
  if (str1.length !== str2.length) {
    return false
  }

  const str1List = Array.from(str1.toUpperCase()) // str1 to array

  // get the occurrences of str1 characters by using HashMap
  const str1Occurs = str1List.reduce(
    (map, char) => map.set(char, map.get(char) + 1 || 1),
    new Map()
  )

  for (const char of str2.toUpperCase()) {
    // if char has not exist to the map it's return false
    if (!str1Occurs.has(char)) {
      return false
    }

    let getCharCount = str1Occurs.get(char)
    str1Occurs.set(char, --getCharCount)

    getCharCount === 0 && str1Occurs.delete(char)
  }

  return true
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74

# 参考

  • Anagram - Wikiwand (opens new window)
  • 易位构词游戏 - Wikiwand (opens new window)
编辑 (opens new window)
上次更新: 2022/10/20, 20:03:22
BoyerMoore [博耶-穆尔字符串搜索算法、BM 算法]
NamingConvention [命名规则]

← BoyerMoore [博耶-穆尔字符串搜索算法、BM 算法] NamingConvention [命名规则]→

最近更新
01
0-20题解
10-31
02
本章导读
10-31
03
算法与转换:Part1
10-28
更多文章>
Theme by Vdoing | Copyright © 2022-2022 Fancy DSA | Made by Jonsam by ❤
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式