【LeetCode】每日一题 面试题 16.18. 模式匹配

104 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

面试题 16.18. 模式匹配

你有两个字符串,即pattern和value。 pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a","go"是"b"),该字符串也匹配像"a"、"ab"和"b"这样的模式。但需注意"a"和"b"不能同时表示相同的字符串。编写一个方法判断value字符串是否匹配pattern字符串。

「示例1:」
输入: pattern = "abba", value = "dogcatcatdog"
输出: true
「示例2:」
输入: pattern = "abba", value = "dogcatcatfish"
输出: false
「示例3:」
输入: pattern = "aaaa", value = "dogcatcatdog"
输出: false
「示例4:」
输入: pattern = "abba", value = "dogdogdogdog"
输出: true
解释: "a"="dogdog",b="",反之也符合规则
「提示:」
1 <= len(pattern) <= 1000
0 <= len(value) <= 1000
你可以假设pattern只包含字母"a""b",value仅包含小写字母。

解题思路

这道题还是有点难度的,需要找到题目中隐藏的条件
设定,a为字母a的长度,b为字母b的长度;
那么满足这样的条件
a+b = pattern.length;
ax + by = value.length;
​
​
a+b = pattern.length;
ax + by = value.length;// x, y分别为模板a和b对应的子串的长度;
那么这个题目需要循环判断的次数就会减少很多;
此外需要注意x和y的最大值和最小值的情况,也可以减少计算步骤;
从x = 0开始,就是字母a代表的模板为空字符串;计算出字母b代表的模板字符串;遍历比较是否符合要求;不符合x++;
一旦符合就返回true;
如果x达到max_x,说明没有满足要求的情况,返回false
注意空字符串的情况

代码实现

/**
 * @param {string} pattern
 * @param {string} value
 * @return {boolean}
 */
var patternMatching = function (pattern, value) {
    if (pattern == '' && value =='') return true;
    var i = 0, a = 0, b = 0, tick_b = null, tick_a = null;
    const l = value.length, p_l = pattern.length;
    while (i < p_l) {
        if (pattern[i] == 'a') {
            tick_a = tick_a === null ? i : tick_a;
            a++;
        } else if (pattern[i] == 'b') {
            tick_b = tick_b === null ? i : tick_b;
            b++;
        }
        i++;
    }
    var x = 0, y = 0, max_x = 0;
    if (a == 0) {
        max_x = 0;
    } else {
        max_x = l / a;
    }
    if (b == 0) {
        x = max_x;
    }
    while (x <= max_x) {
        y = (l - a * x) / b || 0;
        if (parseInt(y) != y) {
            x++;
            continue;
        };
        var i = 0, start = 0, res = false;
        var p_x = tick_a == 0 ? value.substr(0, x) : value.substr(tick_a * y, x),
        p_y = tick_b == 0 ? value.substr(0, y) : value.substr(tick_b * x, y);
        if (tick_b == null) {
            p_y = null;
        }
        if (tick_a == null) {
            p_x = null;
        }
        while (i < p_l) {
            var l_i = pattern[i] == 'a' ? x: y, c = pattern[i] == 'a' ? p_x : p_y;
            var tem = value.substr(start, l_i);
            start = start + l_i;
            if ( tem != c ) {
                res = true;
                break;
            }
            i++;
        }
        if (res == false && p_x !=p_y) {
            return true;
        }
        x++;
    }
    return false;
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;