在略有不同的两个字符串中找到相同的位置

时间:2019-05-26 00:31:17

标签: javascript string algorithm

我有两个字符串,第一个是 master 字符串,第二个是 slave 字符串。它们都包含相似的值,除了从属将添加或删除字符。

我需要为 master 字符串的每个字符找到 slave 字符串中 master 字符串的字符偏移量。

我目前正在使用 percentage 作为在从属字符串中查找相似偏移量的算法。

例如;

const master = 'The chicken is blue, but not really a chicken';
const slave = 'This large bird is blue, but is really a dog';

function slaveOffset(m, offset, s): number {
    return Math.floor(s.length * (offset / m.length));
}

console.log(slaveOffset(master, 15, slave)); // prints 12

从主位置翻译位置15时(读为“小鸡是”),从位置的位置计算为12。由于使用百分比完全不准确(因此未考虑在内),从位置的读数为“ This big b”帐户添加或删除了字符)。

正确的值应该是18(读作“大鸟是”),因为主偏移量以“ is”结尾。

我需要一种slaveOffset()的算法,该算法可以处理添加和删除的字符并找到最可能的从属偏移量。它并不需要太精确,但是应该解决字符更改引起的较大偏差的问题。

1 个答案:

答案 0 :(得分:1)

这是计算机科学中的经典问题,通常称为“数据比较”或简称为“ diff”。最常见的算法采用Longest Common Subsequence技术,但是在一般情况下,这是一个NP难题,因此采用了各种启发式方法来获得“足够好”的结果,通常由人在循环中进行调整。

查找一些diff算法以获取一些想法。

在您的情况下,您可能想从以下启发式开始:“从属字符串在哪里开始不同于主字符串,又在哪里又变得相同”。字符串与前两个字符匹配,但是下一次您获得的三个以上字符匹配序列是在字符is处。这些点成为您可以在slaveOffset函数中使用的标记。