LeetCode 算法:模式匹配

258 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 30 天,点击查看活动详情

模式匹配

原题地址

你有两个字符串,即 patternvaluepattern 字符串由字母 "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 仅包含小写字母。

思路分析

  1. 我们根据题目分析,要想满足题目中的条件,需要满足 lenA * numA + lenB * numB = len,其中,numAnumB 表示 patterna/b 的个数,lenAlenB表示 a/b 表示的字符串的长度,lenvalue 的长度;
  2. 然后定义 indexAindexB 分别表示 a/bpattern 中第一次出现的位置;
  3. 以a来遍历,终止条件为 lenA * numA <= len,在遍历过程中计算b出现的次数以及 a/b 所代表的字符串 strAstrB
  4. 得到长度以及字符串后,可以按照规则拼接成字符串。当只有b时需要判断拼接后的字符串跟 value 是否相同;当只有a且value === ''时返回true,当拼接的字符串跟value相同且strA!==strB时,返回true。其他情况都返回false

AC 代码

/**
 * @param {string} pattern
 * @param {string} value
 * @return {boolean}
 */
var patternMatching = function(pattern, value) {
    const len = value.length
    let numA = 0, numB = 0
    for(c of pattern) {
        if(c === 'a') numA++
        if(c === 'b') numB++
    }
    
    const indexA = pattern.indexOf('a')
    const indexB = pattern.indexOf('b')

    for(let lenA = 0; lenA * numA <= len; lenA++) {
        const lenB = numB > 0 ? parseInt((len - lenA * numA) / numB) : 0
    
        if(lenB !== Math.floor(lenB)) continue
        
        const strA = indexA === -1 ? '' : value.substring(indexA * lenB, indexA * lenB + lenA)
        const strB = indexB === -1 ? '' : value.substring(indexB * lenA, indexB * lenA + lenB)
       
        let str = ''
        for(key in pattern) {
            str += pattern[key] === 'a' ? strA : strB
        }
        
        if(numA === 0) return str === value
        if(numB === 0 && value === '') return true
        if(str === value && strA !== strB) return true
    }
    return false
};

结果:

  • 执行结果: 通过
  • 执行用时:68 ms, 在所有 JavaScript 提交中击败了61.54%的用户
  • 内存消耗:43.9 MB, 在所有 JavaScript 提交中击败了50.00%的用户
  • 通过测试用例:92 / 92

END