LeetCode題解:290. 單詞規律,哈希表,JavaScript,詳細注釋

原題鏈接:
https://leetcode.cn/problems/word-pattern/description/

理解題意:

  1. pattern = "abba", s = "dog cat cat cat"pattern中的a同時映射了s中的dogcat,不正確
  2. pattern = "abba", s = "dog dog dog dog"s中的dog同時映射了pattern中的ab,不正確
  3. pattern = "abba", s = "dog constructor constructor dog",如果let s2p = {}; console.log(typeof s2p.consructor) // functionconsructor無法被映射到“b”,會導致判斷出錯,因此只能用let s2p = new Map()存儲映射關系

解題思路:

  1. 做這題之前,可以先做205. 同構字符串
  2. 用兩個Map,分別存儲pattern -> ss -> pattern的映射關系
  3. 遍歷字符串,查看Map中存儲的映射關系是否與遍歷到的字符不同,出現不同就表示兩個字符串不存在雙向連接規律
  4. 如果正常退出循環,表示沒意義找到不同的映射關系,兩個字符串存在雙向連接規律
/**
 * @param {string} pattern
 * @param {string} s
 * @return {boolean}
 */
var wordPattern = function(pattern, s) {
  // 將s按空格切割成數組
  const arr = s.split(' ')
  // 如果pattern和arr的長度不一致,一定沒有相同的規律
  if (pattern.length !== arr.length) {
    return false
  }
  // 使用Map存儲字符串的映射規律
  // 之所以不用對象,是因為有一個case的s中有constructor
  // 會導致無法映射字符串,而是會映射到constructor函數
  let p2s = new Map()
  let s2p = new Map()

  // 逐個字符對比映射關系
  for (let i = 0; i < pattern.length; i++) {
    // 如果映射關系存在,且與已存儲的映射關系不同,表示不存在規律
    if (
      p2s.has(pattern[i]) && (p2s.get(pattern[i]) !== arr[i]) ||
      s2p.has(arr[i]) && (s2p.get(arr[i]) !== pattern[i])
    ) {
      return false
    }

    // 每次循環都緩存當前映射關系
    p2s.set(pattern[i], arr[i])
    s2p.set(arr[i], pattern[i])
  }

  // 如果正常退出循環,表示遵循規律
  return true
};
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容