持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
一、题目描述:
给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = "abba", str = "dog cat cat dog"
输出: true
示例 2:
输入:pattern = "abba", str = "dog cat cat fish"
输出: false
示例 3:
输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false
提示:
- 1 <= pattern.length <= 300
- pattern 只包含小写英文字母
- 1 <= s.length <= 3000
- s 只包含小写英文字母和 ' '
- s 不包含 任何前导或尾随对空格
- s 中每个单词都被 单个空格 分隔
二、思路分析:
根据pattern的进行hash存储,存储过程中如果发现已经存储且与当前识别字符串不一致,则判定false 存储结束后验证是否有未遍历到的字符,如果有判定false 对hash中的结果进行计数,防止abba这种规则下,'dog dog dog dog'也可以通过的情况 同时判定规则对应的字符串为空的,认为s不满足规则,判定false
三、AC 代码:
/**
* @param {string} pattern
* @param {string} s
* @return {boolean}
*/
var wordPattern = function (pattern, s) {
let hash = {}
let j = 0;
for (let i = 0; i < pattern.length; i++) {
let str = ''
while (s[j] !== ' ' && j < s.length) {
str += s[j]
j++
}
j++
if (!hash[pattern[i]]) {
hash[pattern[i]] = str
continue
}
// console.log(hash, j, pattern[i], str)
if (hash[pattern[i]] !== str) {
return false
}
}
// console.log(hash, j, s.length)
// 判断是否有多余的
if (j < s.length) {
return false
}
// 判断是否有重复的
let tmp = {}
for (let key in hash) {
// 判断是否s中的单词不够
if (hash[key] === '') {
return false
}
if (!tmp[hash[key]]) {
tmp[hash[key]] = 1
continue
}
tmp[hash[key]] ++
}
// 计数查重
for (let key in tmp) {
if (tmp[key] > 1) {
return false
}
}
return true
};