Как вычислить самую длинную общую подстроку в двух строках - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь вычислить самую длинную точную общую подстроку без пробелов между строкой и вектором строк в R. Как мне изменить stringdist, чтобы вернуть любую общую строку в любом месте двух сравниваемых строк и вернуть расстояние?

Воспроизвести данные:

string1 <- "whereiam"
vec1 <- c("firstiam","twoiswhereiaminthisvec","thisisthree","fouriamhere","fivewherehere")

Попытка выполнить попытку функции stringdist (не работает для моих целей):

library(stringdist)
stringdistvec <- stringdist(string1,vec1,method="lcs")
[1]  8 14 13 11 11  #not calculating the lcs type I want

Вместо желаемого результата с объяснением совпадений:

#desired to work to get this result:

desired_stringdistvec <- c(3,8,1,3,5)
[1]  3 8 1 3 5
#match 1: iam (3 common substr)
#match 2: whereiam (8 common substr)
#match 3: i (one letter only)
#match 5: iam (3 common substr)
#match 6: where (5 common substr)

1 Ответ

1 голос
/ 17 июня 2020

Один из подходов может заключаться в просмотре последовательности преобразования, созданной adist(), и подсчете символов в самом длинном непрерывном совпадении:

trafos <- attr(adist(string1, vec1, counts = TRUE), "trafos")
sapply(gregexpr("M+", trafos), function(x) max(0, attr(x, "match.length")))

[1] 3 8 1 3 5
...