给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。具体来说:
pattern中的每个字母都 恰好 映射到s中的一个唯一单词。s中的每个唯一单词都 恰好 映射到pattern中的一个字母。- 没有两个字母映射到同一个单词,也没有两个单词映射到同一个字母。
function wordPattern(pattern: string, s: string): boolean {
const words = s.split(" ");
// 1. 长度校验:如果单词数和模式字符数不等,直接返回 false
if (words.length !== pattern.length) return false;
// 辅助函数:将任何序列(字符串或单词数组)转化成数字索引序列
// 例如 "abba" -> [0, 1, 1, 0]
const getStructure = (items: string | string[]): number[] => {
const map = new Map<string, number>();
const res: number[] = [];
for (let i = 0; i < items.length; i++) {
if (!map.has(items[i])) {
map.set(items[i], i);
}
res.push(map.get(items[i])!);
}
return res;
};
const patternStruct = getStructure(pattern);
const sStruct = getStructure(words);
// 2. 比较两个结构序列是否完全相同
return patternStruct.every((val, index) => val === sStruct[index]);
};