持续创作,加速成长!这是我参与「掘金日新计划 · 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;
};
如果你对这道题目还有疑问的话,可以在评论区进行留言;