力扣刷题👊【290. 单词规律】

312 阅读3分钟

这是我参与8月更文挑战的第 16 天,活动详情查看:8月更文挑战

题目链接

290. 单词规律

题目描述

给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

测试用例

示例1:

输入: pattern = "abba", str = "dog cat cat dog"
输出: true

示例 2:

输入:pattern = "abba", str = "dog cat cat fish"
输出: false

提示:

你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。

题目分析

题目很直观,就是有两个字符串 a, b, a 中的字符是紧邻着的,我们用a = a.split('') 切割成数组,b 是按照空格 分割的,我们用b = b.split(' ') 切割字符串

处理完成之后,按照 index 的下标,存在有a[index] <-> b[index] 双向的对应关系,即 a 中的每一个字符可以按照这个关系转为 b 中对应位置的字符, b 中的每个单词,也能根据这个关系逆向转化为 a 的对应位置的字符

如错误的示例2a <-> dog
b <-> cat
b <-> cat
a <-> fish ✘ dog √

因为数据存在对应关系,建议使用 Map 来做,在 js 中,我个人更加习惯使用过 Object,一个注意点就是,这个是双向的对应关系,判断的时候,存值的时候,要对 key, value 都做检查

例如,判断 key 不存在的时候, key 也一定不存在(存在则违反了双向对应的规则)

如果,key 存在的话,需要有如下的判断

obj[curr_key] == curr_val // 用当前遍历到的 key去缓存数据里换到 val,判断和当前的 val 是否相等
obj[curr_val] == curr_key // 用当前遍历到的 val 去缓存数据里换到 key,判断和当前的 key 是否相等

在最极限的情况下,给出的数据中,存在 26 组合法的对应关系,obj 也就只有 26*2 个键值对

尝试解答

var wordPattern = function(pattern, s) {
    let obj = {},
        a = pattern.split(''),
        b = s.split(' ');
    if(a.length!=b.length)return false;
    for (let i = 0; i < a.length; i++) {
        let n = a[i],
            m = b[i];
        if (obj[n] == null && obj[m] == null) {
            obj[n] = m;
            obj[m] = n;
        } else if (obj[n] != m || obj[m] != n) {
            return false;
        }
    }
    return true;
};

壮烈的倒在了测试用例 a = "abc", b = "b c a",第二个字符串里面切割后居然还是单个字符?果然是我年轻了

图片.png

不知道大佬们怎么处理的,我脑子里突然就冒出一个念头,反正是保证他们的双向映射关系正确就行,那我直接给 b 字符串切割后的单词补充一个任意字符不就结了?

代码 m = b[i] 修改为 m = b[i] + '-' 完美避坑,我这可真是写 bug 的一把好手~ 诠释了如何面向花哨的测试用例编程

图片.png