【力扣】290.单词规律|每日一题|刷题打卡

91 阅读2分钟

一、题目描述

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

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

 

示例1:

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

示例 2:

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

示例 3:

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

 

提示:

  • 1 <= pattern.length <= 300
  • pattern 只包含小写英文字母
  • 1 <= s.length <= 3000
  • s 只包含小写英文字母和 ' '
  • s 不包含 任何前导或尾随对空格
  • s 中每个单词都被 单个空格 分隔

二、思路分析

主要思路是通过建立两个 Map 对象来处理模式 pattern 和字符串 s 之间的映射关系,然后检查是否满足一一对应的规则

  1. 检查 mp 是否已经包含了 pattern[i]。如果没有包含,说明这是第一次出现该字符,并且要建立 pattern[i]arr[i] 的映射关系。但在建立映射关系之前,需要检查 mp2 是否已经包含了 arr[i](也就是当前的单词)。如果 mp2 已经包含了当前的单词,说明该单词已经被映射到其他的字符上,违反了唯一映射的规则,直接返回 false
  2. 如果 mp 已经包含了 pattern[i],则检查 pattern[i] 对应的值是否等于 arr[i]。如果不等于,说明当前的模式字符已经被映射到了其他的单词上,违反了一一对应的规则,直接返回 false
  3. 剩下的就是将 mp2 中建立单词到字符的反向映射关系,即将 arr[i] 映射到 pattern[i]
// 最终可以得到:
// 示例 :pattern = "abba", s = "dog cat cat dog"
// mp: Map { 'a' => 'dog', 'b' => 'cat' } , mp2: Map { 'dog' => 'a', 'cat' => 'b' }

三、代码答案

/**
 * @param {string} pattern
 * @param {string} s
 * @return {boolean}
 */
var wordPattern = function (pattern, s) {
  const arr = s.split(' ')
  if (pattern.length !== arr.length) return false;
  const mp = new Map();
  const mp2 = new Map();
  for (let i = 0; i < pattern.length; i++) { 
    if (!mp.has(pattern[i])) {
      if (mp2.has(arr[i])) return false;
      mp.set(pattern[i], arr[i])
    }
    if (mp.get(pattern[i]) !== arr[i]) return false;
    mp2.set(arr[i], pattern[i])
  }
  return true;
};