# 单词规律(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

题目中说明了双向连接,意味着spattern中一一对应且无重复(上面的第三四个例子说明了这种情况),所以我们使用两个Map存储双向连接。如果两个Map中的键都不存在对应的patterns,那么使用set()存储;否则(任意一个Map中存在patterns),判断两个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