【leetcode】290. 单词规律

49 阅读1分钟

leetcode-290.png

这一题和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;
};