找到长度为n的所有可能的子串

Lio*_*nir 5 r

我有一个有趣的(仅限我,也许,:))问题.我有这样的文字:

"abbba"
Run Code Online (Sandbox Code Playgroud)

问题是在此字符串中查找长度为n的所有可能的子字符串.例如,如果n = 2,子串是

'ab','bb','ba'
Run Code Online (Sandbox Code Playgroud)

如果n = 3,子串是

'abb','bbb','bba'
Run Code Online (Sandbox Code Playgroud)

我想用这样的东西:

x <- 'abbba'
m <- matrix(strsplit(x, '')[[1]], nrow=2)
apply(m, 2, paste, collapse='')
Run Code Online (Sandbox Code Playgroud)

但我得到了一个警告,它对len = 3不起作用.

Jul*_*ora 10

我们可以使用

x <- "abbba"
allsubstr <- function(x, n) unique(substring(x, 1:(nchar(x) - n + 1), n:nchar(x)))
allsubstr(x, 2)
# [1] "ab" "bb" "ba"
allsubstr(x, 3)
# [1] "abb" "bbb" "bba"
Run Code Online (Sandbox Code Playgroud)

其中substringx指定位置开始和结束提取子字符串.我们利用substring矢量化的事实并1:(nchar(x) - n + 1)作为起始位置和n:nchar(x)结束位置传递.


Pie*_*une 2

向量的所有combn组合将按列排列。事先分割向量并转置结果将得到矩阵形式的结果。然后可以将其与do.call(paste,...)矩阵组合作为数据框:

mat <- unique(t(combn(strsplit(x, "")[[1]],2)))
do.call(paste0, as.data.frame(mat))
#[1] "ab" "aa" "bb" "ba"
Run Code Online (Sandbox Code Playgroud)

更新

combn我们还可以使用更短的语法指定处理组合的方式(@docendo):

unique(combn(strsplit(x, "")[[1]],3, FUN=paste, collapse=""))
Run Code Online (Sandbox Code Playgroud)

编辑

仅当您正在寻找所有组合时才使用此解决方案。如果您只是寻求滚动分割,请使用朱利叶斯的答案。