持续创作,加速成长!这是我参与「掘金日新计划 · 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
->str
和str
->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
};