给定一种规律 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]);
};