我有两个字符串,第一个是 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()
的算法,该算法可以处理添加和删除的字符并找到最可能的从属偏移量。它并不需要太精确,但是应该解决字符更改引起的较大偏差的问题。
答案 0 :(得分:1)
这是计算机科学中的经典问题,通常称为“数据比较”或简称为“ diff”。最常见的算法采用Longest Common Subsequence技术,但是在一般情况下,这是一个NP难题,因此采用了各种启发式方法来获得“足够好”的结果,通常由人在循环中进行调整。
查找一些diff
算法以获取一些想法。
在您的情况下,您可能想从以下启发式开始:“从属字符串在哪里开始不同于主字符串,又在哪里又变得相同”。字符串与前两个字符匹配,但是下一次您获得的三个以上字符匹配序列是在字符,
i
和s
处。这些点成为您可以在slaveOffset
函数中使用的标记。