Это грубое, неоптимальное решение:
let commonSubstring = (str1, str2, minLen=1) => {
let best = { len: 0, off1: null, off2: null };
for (let off1 = 0; off1 < str1.length - minLen; off1++) {
for (let off2 = 0; off2 < str2.length - minLen; off2++) {
// Holds the number of characters that match
let maxLen = Math.min(str1.length - off1, str2.length - off2);
let len = 0;
while (len < maxLen && str1[off1 + len] === str2[off2 + len]) len++;
// Store this result if it's the best yet
if (len > best.len) best = { len, off1, off2 };
}
}
// We can now assert that str1.slice(best.off1, best.len) === str2.slice(best.off2, best.len)
return best.len >= minLen ? str1.slice(best.off1, best.off1 + best.len) : null;
};
let tests = [
[ 'mustard', 'hustler' ],
[ 'lemon', 'harlem' ],
[ 'marshmallow', 'hollow' ],
[ 'marshmallow', 'marshal' ],
[ 'jefferson', 'jeffery' ]
];
console.log('Examples:');
for (let [ str1, str2 ] of tests) {
console.log(`Strings "${str1}" and "${str2}" share substring "${commonSubstring(str1, str2, 2)}"`);
}
Идея состоит в том, чтобы перебрать все пары смещений в пределах str1
и str2
. В конце концов мы придем к смещениям, где встречается самая длинная последовательность общих символов.
Обратите внимание, что я предоставил minLen
в качестве параметра. Вы можете установить его на 2
, если хотите отбросить результаты длиной менее 2
символов.