【发布时间】:2017-02-07 12:09:25
【问题描述】:
例如,我得到以下由 0 和 1 组成的字符串:001011。 这是我的模式,或字符串 A。 然后,给我一个更长的 0 和 1 的字符串 B(例如:010100010010010),我的任务是在 B 中找到字符串 A 的最合适的匹配,我说,,最合适的“因为它不需要必须是字符串A,最大可能有20%的误差。
例如:对于字符串 A:01001,一个好的匹配应该是 11001。字符串 B 的 80% 匹配字符串 A,除了第一位。对于同一个 A 字符串,11101 将仅匹配其中的 60%(11101 中第一个和第三个位置的位与 A 中的第一个和第三个位不匹配),这不是所需的解决方案。
如果 N 是字符串 A 的位数,这意味着我一次对 B 的 N 长度序列执行检查(B 中的评估位必须在连续的位置上,所以这排除了 B 中的子字符串)。例如: 让它成为 A-01011 和 B-010100100111。首先我们评估序列 01010(B 的前 5 位从第一个位置开始),然后是 10100(前 5 位从 B 的第二位开始)。在这个例子中,在 01010 中只有 4 位与 A 匹配,这意味着 01010 是 80% 的匹配。关于 10100,与 A 没有位匹配,因此是 0% 匹配。
我可能会遇到 A 为:01001 而 B 为:01101 的情况(B 的前 2 位与 A 的前 2 位匹配,B 的后 2 位与 A 的后 2 位匹配)。因此,它是 80% 的匹配。
如果 A 比 B 长,则 A 在 B 中没有匹配项。
我想知道解决这个问题的算法、策略。我希望我尽可能清楚地说明了这个问题,如果没有,我将进行修改,为您提供进一步的解释。我认为这个问题实际上可能在现实世界中有一些关于模式匹配的应用。 我需要一个解决方案,我期待尽可能地改进解释。
【问题讨论】:
-
我将从逐个字符遍历字符串开始,并将它们与我的搜索字符串进行比较。也许做多次超限,你首先尝试找到一个完全匹配,然后搜索你的搜索字符串的轻微修改。这是一种蛮力方法,但它可以帮助您入门。之后进行优化。也许还可以查看正则表达式和正则表达式的实现方式。这也可能有所帮助。
-
您正在比较 1 和 0 的字符串。这是否意味着您正在比较 1 和 0 的
Strings?如果是这样,您是在寻找可以应用于任意两个Strings 的通用算法,还是只关心 1 和 0?如果您只关心 1 和 0,那么 @Gijs 答案是一个很好的起点。否则,我同意您应该从蛮力实施开始(相当简单),并寻找优化它的具体方法。