「前端刷题」290.单词规律(EASY)

56 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

题目(Word Pattern)

链接:https://leetcode-cn.com/problems/word-pattern
解决数:1533
通过率:44.9%
标签:哈希表 字符串 
相关公司:amazon facebook google 

给定一种规律 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 中每个单词都被 单个空格 分隔

思路

  • 第一次遍历,检查pattern一个字母是否对应str一个单词
  • 第二次遍历,检查str一个单词是否对应pattern一个字母

代码

Map

var wordPattern = function(pattern, s) {
    const a = s.split(' '), len = pattern.length
    if (len !== a.length) return false
    let h = new Map, i = -1
    while(++i < len) {
        const p = pattern[i], s = a[i]
        if (h.has(p)) {
            if (h.get(p) !== s) return false 
        } else {
            h.set(p, s)
        }
    }
    h = new Map, i = -1
    while(++i < len) {
        const p = pattern[i], s = a[i]
        if (h.has(s)) {
            if (h.get(s) !== p) return false 
        } else {
            h.set(s, p)
        }
    }
    return true
};

Object

var wordPattern = function(pattern, s) {
    const a = s.split(' '), len = pattern.length
    if (len !== a.length) return false
    let h = Object.create(null), i = -1
    while(++i < len) {
        const p = pattern[i], s = a[i]
        if (h[p] !== void 0) {
            if (h[p] !== s) return false 
        } else {
            h[p] = s
        }
    }
    h = Object.create(null), i = -1
    while(++i < len) {
        const p = pattern[i], s = a[i]
        if (h[s] !== void 0) {
            if (h[s] !== p) return false 
        } else {
            h[s] = p
        }
    }
    return true
};

Array + Object

var wordPattern = function(pattern, s) {
    const a = s.split(' '), len = pattern.length
    if (len !== a.length) return false
    let h = Array(26), i = -1
    while(++i < len) {
        const p = pattern.charCodeAt(i) - 97, s = a[i]
        if (h[p] !== void 0) {
            if (h[p] !== s) return false 
        } else {
            h[p] = s
        }
    }
    h = Object.create(null), i = -1
    while(++i < len) {
        const p = pattern[i], s = a[i]
        if (h[s] !== void 0) {
            if (h[s] !== p) return false 
        } else {
            h[s] = p
        }
    }
    return true
};

思路2

  • 一次遍历,同时检查pattern->strstr->pattern是否对应。上解法代码合并即可

代码

Map

var wordPattern = function(pattern, s) {
    const a = s.split(' ')
    if (pattern.length !== a.length) return false
    const hp = new Map, hs = new Map
    for (let i = 0; i < a.length; i++) {
        let p = pattern[i], s = a[i]
        if (hp.has(p)) {
            if (hp.get(p) !== s) return false 
        } else {
            hp.set(p, s)
        }
        if (hs.has(s)) {
            if (hs.get(s) !== p) return false
        } else {
            hs.set(s, p)
        }
    }
    return true
};

Object

var wordPattern = function(pattern, s) {
    const a = s.split(' ')
    if (pattern.length !== a.length) return false
    const hp = Object.create(null), hs = Object.create(null)
    for (let i = 0; i < a.length; i++) {
        let p = pattern[i], s = a[i]
        if (hp[p] !== void 0) {
            if (hp[p] !== s) return false 
        } else {
            hp[p] = s
        }
        if (hs[s] !== void 0) {
            if (hs[s] !== p) return false
        } else {
            hs[s] = p
        }
    }
    return true
};

Array + Object

var wordPattern = function(pattern, s) {
    const a = s.split(' ')
    if (pattern.length !== a.length) return false
    const hp = Array(26), hs = Object.create(null)
    for (let i = 0; i < a.length; i++) {
        let p = pattern.charCodeAt(i) - 97, s = a[i]
        if (hp[p] !== void 0) {
            if (hp[p] !== a[i]) return false 
        } else {
            hp[p] = a[i]
        }
        if (hs[s] !== void 0) {
            if (hs[s] !== p) return false
        } else {
            hs[s] = p
        }
    }
    return true
};