2

2 つの文字列が共有する共通のパターンを識別する (簡単な) 可能性はありますか? 私が言いたいことを明確にするための小さな例を次に示します。

文字列を含む 2 つの変数があります。どちらも同じパターン (「ABC」) といくつかの「ノイズ」を含んでいます。

a <- "xxxxxxxxxxxABCxxxxxxxxxxxx"
b <- "yyyyyyyyyyyyyyyyyyyyyyyABC"

一般的なパターンがわからないので、両方の文字列に「ABC」が含まれていることを R に確認させたいとします。これどうやってするの?

*編集

最初の例は少し単純すぎたかもしれません。これが私の実際のデータの例です。

a <- "DUISBURG-HAMBORNS"
b <- "DUISBURG (-31.7.29)S"

どちらの文字列にも、関数で識別したい「DUISBURG」が含まれています。

*編集

コメントに投稿されたリンクで提案された解決策を採用しました。しかし、私はまだ欲しいものを正確に持っていません。

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

[1] "D" "U" "I" "S" "B" "U" "R" "G" "-" " " " " "S"

関数が 2 つのベクトルの最長の共通サブシーケンスを探している場合、なぜ の後で停止しないの"D" "U" "I" "S" "B" "U" "R" "G"ですか? .

4

1 に答える 1

7

パッケージの関数 (2 つの文字変数間の共通部分文字列をLCS検索;重複の可能性はありません) は、必要なもの以外のことを行います。これは、サブシーケンスが元のシーケンス内の連続した位置を占有する必要がない、最長共通サブシーケンスの問題を解決します。qualV

あなたが持っているのは、このアルゴリズムを使用できる最長共通部分文字列の問題です。これは、一意の(長さに関して)最長共通部分文字列があると仮定したコードです。

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"
于 2016-02-13T19:22:28.157 に答える