【发布时间】:2016-03-23 22:03:55
【问题描述】:
我在一次采访中遇到了这个问题,我被困在最好的解决方法上。问题如下:
给定一个单词的字符串序列和一个字符串序列模式,如果单词序列与模式匹配则返回 true,否则返回 false。
匹配的定义:替换变量的单词必须始终跟在该替换之后。例如,如果“f”被替换为“monkey”,那么任何时候我们看到另一个“f”,那么它必须匹配“monkey”,并且任何时候我们再次看到“monkey”,它必须匹配“f”。
示例
输入:“ant dog cat dog”、“a d c d”
输出:真
这是真的,因为每个变量都映射到一个单词,反之亦然。
一只 -> 蚂蚁
d -> 狗
c -> 猫
d -> 狗
输入:“ant dog cat dog”、“a d c e”
输出:假
这是错误的,因为如果我们将“d”替换为“dog”,那么您不能也将“e”替换为“dog”。
一只 -> 蚂蚁
d, e -> dog(d 和 e 都不能同时映射到 dog 所以错误)
c -> 猫
输入:“monkey dog eel eel”、“e f c c”
输出:真
这是真的,因为每个变量都映射到一个单词,反之亦然。
e -> 猴子
f -> 狗
c -> 鳗鱼
一开始,我也想过做如下的事情……
function matchPattern(pattern, stringToMatch) {
var patternBits = pattern.split(" ");
var stringBits = stringToMatch.split(" ");
var dict = {};
if (patternBits.length < 0
|| patternBits.length !== stringBits.length) {
return false;
}
for (var i = 0; i < patternBits.length; i++) {
if (dict.hasOwnProperty(patternBits[i])) {
if (dict[patternBits[i]] !== stringBits[i]) {
return false;
}
} else {
dict[patternBits[i]] = stringBits[i];
}
}
return true;
}
var ifMatches = matchPattern("a e c d", "ant dog cat dog");
console.log("Pattern: " + (ifMatches ? "matches!" : "does not match!"));
但是,我意识到这不起作用并且示例 #2 失败,因为它错误地返回 true。处理此问题的一种方法是使用双向字典或两个字典,即同时存储 {"a": "ant"} 和 {"ant": "a"} 并在 if 检查中检查这两种情况。然而,这似乎是浪费空间。有没有更好的方法来解决这个问题而不使用正则表达式?
【问题讨论】:
-
你对匹配的定义不清楚。写一些解释为什么第一个例子通过,第二个失败。我可以猜到为什么,但很可能你不是来听猜测的。您只是比较单词的首字母吗?
标签: string algorithm pattern-matching