这一题和205题比较像,思路基本一致,设置两个map来正反映射即可。在205题中,可以利用其题目的性质,使用数组来存储映射,但是在这一题里面,数组不方便来正反映射,直接使用map即可。
var wordPattern = function (pattern, s) {
let words = s.split(' ')
if (pattern.length !== words.length) return false
let mapC2W = new Map()
let mapW2C = new Map()
for (let i = 0; i < pattern.length; ++i) {
// 两个map都不包含目标元素,执行添加
if (!mapC2W.has(pattern[i]) && !mapW2C.has(words[i])) {
mapC2W.set(pattern[i], words[i])
mapW2C.set(words[i], pattern[i])
}
// 存在目标元素,查找并与当前的value进行比对
if (mapC2W.has(pattern[i]) && mapC2W.get(pattern[i]) !== words[i]) return false
if (mapW2C.has(words[i]) && mapW2C.get(words[i]) !== pattern[i]) return false
}
return true
};
对于上面的最后两个if的优化
var wordPattern = function (pattern, s) {
let arr = s.split(" ");
if (arr.length !== pattern.length) return false;
let map1 = new Map(),
map2 = new Map();
for (let i = 0; i < pattern.length; ++i) {
if (!map1.has(pattern[i]) && !map2.has(arr[i])) {
map1.set(pattern[i], arr[i]);
map2.set(arr[i], pattern[i]);
} else {
if (
map1.get(pattern[i]) !== arr[i] ||
map2.get(arr[i]) !== pattern[i]
)
return false;
}
}
return true;
};