确定一个共同的模式

Ale*_*lex 2 string r lcs

是否有(容易)识别两个字符串共有的共同模式的可能性?这里有一个小例子来说明我的意思:

我有两个包含字符串的变量.两者都包括相同的模式("ABC")和一些"噪音".

a <- "xxxxxxxxxxxABCxxxxxxxxxxxx"
b <- "yyyyyyyyyyyyyyyyyyyyyyyABC"
Run Code Online (Sandbox Code Playgroud)

让我说我不知道​​常见的模式,我希望R找出两个字符串都包含"ABC".我怎样才能做到这一点?

*编辑

第一个例子可能有点简单化.这是我的真实数据的一个例子.

a <- "DUISBURG-HAMBORNS"
b <- "DUISBURG (-31.7.29)S"
Run Code Online (Sandbox Code Playgroud)

两个字符串都包含"DUISBURG",我希望函数能够识别.

*编辑

我在评论中发布的链接中提出了解决方案.但我仍然没有我想要的.

library(qualV)
LCS(strsplit(a[1], '')[[1]],strsplit(b[1], '')[[1]])$LCS

[1] "D" "U" "I" "S" "B" "U" "R" "G" "-" " " " " "S"
Run Code Online (Sandbox Code Playgroud)

如果函数正在寻找两个向量的最长公共子序列,为什么它不会停止"D" "U" "I" "S" "B" "U" "R" "G"?.

Jul*_*ora 6

功能LCSqualV包(中找到两个字符变量之间的共同子 ; 没有可能重复的)做一些事情比你需要什么.它解决了最长的常见子序列问题,其中子序列不需要占据原始序列内的连续位置.

你所拥有的是最常见的子串问题,你可以使用这个算法,这里的代码假设有一个唯一的(就长度而言)最长的公共子串:

a <- "WWDUISBURG-HAMBORNS"
b <- "QQQQQQDUISBURG (-31.7.29)S"

A <- strsplit(a, "")[[1]]
B <- strsplit(b, "")[[1]]

L <- matrix(0, length(A), length(B))
ones <- which(outer(A, B, "=="), arr.ind = TRUE)
ones <- ones[order(ones[, 1]), ]
for(i in 1:nrow(ones)) {
  v <- ones[i, , drop = FALSE]
  L[v] <- ifelse(any(v == 1), 1, L[v - 1] + 1)
}
paste0(A[(-max(L) + 1):0 + which(L == max(L), arr.ind = TRUE)[1]], collapse = "")
# [1] "DUISBURG"
Run Code Online (Sandbox Code Playgroud)