携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 30 天,点击查看活动详情
模式匹配
原题地址
你有两个字符串,即 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) <= 10000 <= len(value) <= 1000- 你可以假设
pattern只包含字母"a"和"b",value仅包含小写字母。
思路分析
- 我们根据题目分析,要想满足题目中的条件,需要满足
lenA * numA + lenB * numB = len,其中,numA、numB表示pattern中a/b的个数,lenA、lenB表示a/b表示的字符串的长度,len为value的长度; - 然后定义
indexA、indexB分别表示a/b在pattern中第一次出现的位置; - 以a来遍历,终止条件为
lenA * numA <= len,在遍历过程中计算b出现的次数以及a/b所代表的字符串strA和strB; - 得到长度以及字符串后,可以按照规则拼接成字符串。当只有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