原題鏈接:
https://leetcode.cn/problems/word-pattern/description/
理解題意:
-
pattern = "abba", s = "dog cat cat cat"
,pattern
中的a
同時映射了s
中的dog
和cat
,不正確 -
pattern = "abba", s = "dog dog dog dog"
,s
中的dog
同時映射了pattern
中的a
和b
,不正確 -
pattern = "abba", s = "dog constructor constructor dog"
,如果let s2p = {}; console.log(typeof s2p.consructor) // function
,consructor
無法被映射到“b”
,會導致判斷出錯,因此只能用let s2p = new Map()
存儲映射關系
解題思路:
- 做這題之前,可以先做205. 同構字符串
- 用兩個Map,分別存儲
pattern -> s
和s -> pattern
的映射關系 - 遍歷字符串,查看Map中存儲的映射關系是否與遍歷到的字符不同,出現不同就表示兩個字符串不存在雙向連接規律
- 如果正常退出循環,表示沒意義找到不同的映射關系,兩個字符串存在雙向連接規律
/**
* @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
};