Musisz znaleźć Longest common substring.
Jeśli struny nie są bardzo długie, zalecam stosowanie podejścia Tima. W przeciwnym razie jest to implementacja JavaScript najdłuższego wspólnego algorytmu podciągu z dynamicznym programowaniem. Runtime to O (mn), gdzie m i n są odpowiednio długościami dwóch ciągów.
Przykład użycia:
var first = "Here is a quick guide for the next time you reach for your favorite oil and some other topics";
var second = "favorite oil and some other topics can be based on something blah blah";
console.log(first.intersection(second)); // ["favorite oil and some other topic"]
Jest to implementacja algorytmu. Zwraca tablicę najdłuższego wspólnego (-ych) podciągu (-ów). Rozszerzono natywną klasę String, dzięki czemu metoda przecięcia jest dostępna we wszystkich ciągach.
String.prototype.intersection = function(anotherString) {
var grid = createGrid(this.length, anotherString.length);
var longestSoFar = 0;
var matches = [];
for(var i = 0; i < this.length; i++) {
for(var j = 0; j < anotherString.length; j++) {
if(this.charAt(i) == anotherString.charAt(j)) {
if(i == 0 || j == 0) {
grid[i][j] = 1;
}
else {
grid[i][j] = grid[i-1][j-1] + 1;
}
if(grid[i][j] > longestSoFar) {
longestSoFar = grid[i][j];
matches = [];
}
if(grid[i][j] == longestSoFar) {
var match = this.substring(i - longestSoFar + 1, i);
matches.push(match);
}
}
}
}
return matches;
}
Należy również tę funkcję pomocnika stworzyć 2d tablicę ze wszystkimi elementami zainicjować 0.
// create a 2d array
function createGrid(rows, columns) {
var grid = new Array(rows);
for(var i = 0; i < rows; i++) {
grid[i] = new Array(columns);
for(var j = 0; j < columns; j++) {
grid[i][j] = 0;
}
}
return grid;
}
Dobra odpowiedź. Sam rozważałem wdrożenie tego, ale miałem pracę do wykonania. –
Anurag, wielkie dzięki. działa pięknie! – kakopappa
@Aruna - cieszę się, że zadziałało. @Tim - jest szybki, ale brakuje mu prostoty.istnieje inny algorytm, który używa drzewek przyrostków i zajmuje O (n + m), ale nie dzisiaj :) – Anurag