# 单词规律(290)
# 题目
给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
# 示例
输入: pattern = "abba"
, str = "dog cat cat dog"
输出: true
输入: pattern = "abba"
, str = "dog cat cat fish"
输出: false
输入: pattern = "aaaa"
, str = "dog cat cat dog"
输出: false
输入: pattern = "abba"
, str = "dog dog dog dog"
输出: false
# 说明
你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。
# 算法
# 双Map
题目中说明了双向连接
,意味着s
和pattern
中一一对应且无重复(上面的第三四个例子说明了这种情况),所以我们使用两个Map
存储双向连接
。如果两个Map中的键都不存在对应的pattern
和s
,那么使用set()
存储;否则(任意一个Map
中存在pattern
和s
),判断两个Map
中存储的对应关系是否正确,只要有一个不正确就返回false
;当循环完毕说明模式正确,返回true
需要注意的是我们可以在开始循环前,判断s.split(" ")
和pattern
的长度关系,若长度不相同则不可能匹配,直接返回false
export const wordPattern = (pattern, s) => {
const pattern2s = new Map();
const s2pattern = new Map();
const strArr = s.split(" ");
if (strArr.length !== pattern.length) return false;
for (let i = 0; i < pattern.length; i++) {
if (!pattern2s.has(pattern[i]) && !s2pattern.has(strArr[i])) {
pattern2s.set(pattern[i], strArr[i]);
s2pattern.set(strArr[i], pattern[i]);
} else if (pattern2s.get(pattern[i]) !== strArr[i] || s2pattern.get(strArr[i]) !== pattern[i]) {
return false;
}
}
return true;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
← 转换成小写字母(709) 找不同(389) →