【发布时间】:2015-03-31 11:01:55
【问题描述】:
我有一个关于在 R 中查找最长公共子字符串的问题。在搜索 StackOverflow 上的一些帖子时,我了解了 qualV 包。但是,我看到这个包中的 LCS 函数实际上找到了 string1 中存在于 string2 中的所有字符,即使它们不连续。
解释一下,如果字符串是 string1 : "hello" string2 : "hel12345lo" 我希望输出是 hel,但是我得到的输出是 hello。我一定做错了什么。请在下面查看我的代码。
library(qualV)
a= "hello"
b="hel123l5678o"
sapply(seq_along(a), function(i)
paste(LCS(substring(a[i], seq(1, nchar(a[i])), seq(1, nchar(a[i]))),
substring(b[i], seq(1, nchar(b[i])), seq(1, nchar(b[i]))))$LCS,
collapse = ""))
我也尝试了 Rlibstree 方法,但我仍然得到不连续的子字符串。另外,子字符串的长度也超出了我的预期。请看下文。
> a = "hello"
> b = "h1e2l3l4o5"
> ll <- list(a,b)
> lapply(data.frame(do.call(rbind, ll), stringsAsFactors=FALSE), function(x) getLongestCommonSubstring(x))
$do.call.rbind..ll.
[1] "h" "e" "l" "o"
> nchar(lapply(data.frame(do.call(rbind, ll), stringsAsFactors=FALSE), function(x) getLongestCommonSubstring(x)))
do.call.rbind..ll.
21
【问题讨论】:
-
@Andrie,我尝试了链接中的 Rlibstree 方法。但是,我仍然得到不连续的子字符串。匹配子字符串的长度也是关闭的。已添加信息作为编辑我上面的原始帖子。请看一看。
-
澄清一下:qualV 的
LCS函数没有找到最长的公共子串,它找到了最长的公共子序列——因此你得到了结果。这就是子序列的定义。这些问题是相关的,但有完全不同的解决方案,最长的常见子序列问题是计算机科学中更经典的问题,因此是更经常实现的问题。