首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字符串序列中查找重复的子串

从字符串序列中查找重复的子串
EN

Stack Overflow用户
提问于 2014-11-11 21:53:26
回答 2查看 184关注 0票数 0

我有许多字符串序列。从每个序列中,我必须找到所有这样的子串,它们至少重复一些最小阈值时间(Th)。

例如,如果字符串序列中的一个是"aboaboaboaboaboabcabcabcabcab“。如果最小重复阈值(th=4),则特定序列子串是“ab0”、"boa“、"oab”、"abc“、"bca”、"cab“。

我用蛮力解决了这个问题。但是如果我们将该方法应用于至少100000个这样的序列,那么它在R中需要几分钟。我想在几秒钟内找到100000个序列中的所有这样的子串。

我想在R中实现它。

EN

回答 2

Stack Overflow用户

发布于 2014-11-11 22:36:26

你可以使用combn,但据我所知,它不尊重顺序,所以得到的组合比遵循顺序的组合要多得多,例如,

代码语言:javascript
复制
s <- "aboaboaboaboaboabcabcabcabcab"
combos <- combn(strsplit(s, "")[[1]], 3, paste0, collapse="")
combos[1:5]
[1] "abo" "aba" "abb" "abo" "aba"
票数 0
EN

Stack Overflow用户

发布于 2014-11-12 03:11:20

这似乎是有效的(假设您需要3个字母的子字符串)。

代码语言:javascript
复制
str <- "aboaboaboaboaboabcabcabcabcab"
th  <- 4

sub <- sapply(1:(nchar(str)-2),function(i)substr(str,i,i+2))
sub[which(table(sub)>=th)]
# [1] "abo" "boa" "oab" "abo" "boa" "oab"

以及一些长度为100,000的字符串的基准测试。

代码语言:javascript
复制
get.repeats <- function(str,n,k){
  sub <- sapply(1:(nchar(str)-n+1),function(i)substr(str,i,i+n-1))
  sub[which(table(sub)>=k)]
}
# benchmark
set.seed(1)
str <- paste(sample(c("A","C","G","T"),1e5,replace=TRUE),collapse="")
library(microbenchmark)
microbenchmark(get.repeats(str,3,4),times=10)
# Unit: seconds
#                    expr      min      lq   median       uq      max neval
#  get.repeats(str, 3, 4) 1.835401 1.86695 1.886206 1.917245 2.035076    10

所以这大约在2秒内运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26866476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档