Пока только про сравнение двух строк.
Предлагаю прокатиться одной строкой вдоль второй.
_________zzzoooABCuuu
xxxABCiii |||
xxxABCiii |||
xxxABCiii |||
... |||
xxxABCiii
...
xxxABCiii
Начать ещё до их пересечения – это максимально возможное их несовпадение.
И сдвигать по одной позиции вправо.
Сравнивать, считая ошибки: количество не совпавших позиций.
Взять тот сдвиг, где ошибок минимум.
С «минимальными отличиями» пока не придумал ничего толкового. В этом коде просто предполагаю, что единично-отличные символы находятся не с краю совпадающих строк. Иначе всегда можно присобачить по 1 лишнему символу в начале и в конце, заявив, что именно они в этот раз случайно оказались разными )
шит-кодfunction mostCommon(a, b) {
const A = a.split('');
const B = b.split('');
const min = {
diff: A.length + B.length,
index: -A.length,
start: undefined,
finish: undefined,
};
for (let offset = -A.length; offset < B.length; offset++) {
let diff = Math.max(0, -offset) + Math.max(offset + A.length - B.length, 0);
const initialDiff = Math.max(0, -offset) + Math.max(offset + A.length - B.length, 0);
const start = Math.min(Math.max(0, offset), B.length);
const finish = Math.min(Math.max(0, offset + A.length), B.length);
let matchStart;
let matchFinish;
for (let i = start, isMatchStarted = false; i < finish; i++) {
if (B[i] !== A[i - offset]) diff++;
else {
if (!isMatchStarted) {
matchStart = i;
isMatchStarted = true;
}
matchFinish = i;
}
}
if (diff < min.diff) {
min.diff = diff;
min.index = offset;
min.start = matchStart;
min.finish = matchFinish;
}
}
console.log(min, b.substring(min.start, min.finish + 1));
return min;
}
mostCommon('xxx>abcABCxxx', 'bbbzzz>abcAXCiiiqqq');
// { diff: 7, index: 3, start: 6, finish: 12 } >abcAXC
На примере из вопроса:
mostCommon("1246380924534", "88899212465809");
// { diff: 6, index: 6, start: 6, finish: 13 } 12465809