290.单词规律(JS)

229 阅读1分钟

单词规律

Category Difficulty Likes Dislikes
algorithms Easy (39.79%) 92 -
Tags

hash-table

Companies
给定一种规律 `pattern` 和一个字符串 `str` ,判断 `str` 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

示例1:

输入: pattern = "abba", str = "dog cat cat dog"
输出: true

示例 2:

输入:pattern = "abba", str = "dog cat cat fish"
输出: false

示例 3:

输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false

示例 4:

输入: pattern = "abba", str = "dog dog dog dog"
输出: false

说明: 你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。

1

/*
 * @lc app=leetcode.cn id=290 lang=javascript
 *
 * [290] 单词规律
 */
/**
 * @param {string} pattern
 * @param {string} str
 * @return {boolean}
 */
var wordPattern = function (pattern, str) {
  const strArr = str.split(' ')
  let map = new Map()
  let set = new Set()
  if (pattern.length !== strArr.length) return false
  for (let i = 0; i < pattern.length; i++) {
    if (!map.has(pattern[i])) {
      if (set.has(strArr[i])) return false
      map.set(pattern[i], strArr[i])
      set.add(strArr[i])
    }
    else if (map.get(pattern[i]) !== strArr[i]) return false
  }
  return true
};

这道题还是比较容易想到的

难的是很容易忘记考虑两种情况

  1. wordPattern('aaa', 'dog dog dog dog')

长度不匹配的时候,我们就直接返回false即可

if (strArr.length !== pattern.length) return false
  1. wordPattern('abba', 'dog dog dog dog')

key-value中是不允许key不同而value相同的

所以我们使用一个set来缓存我们在map里添加过的value

当我们在添加时,我们就要先判断一下这个value是不是已经添加过的

如果是 就直接返回false

if (!map.has(pattern[i])) {
  if (set.has(strArr[i])) return false
  map.set(pattern[i], strArr[i])
  set.add(strArr[i])
}