查找并标注匹配的括号对
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找并标注匹配的括号对相关的知识,希望对你有一定的参考价值。
给定以下一串嵌套的小括号。
a = "[[[][]]][[[][][]]]"
我想找一下在以下情况下的一对开闭括号 a
并用常用的ID标记它们的位置。例如,我想创建一个ID的向量,它的样子是这样的
b = c(1,2,3,3,4,4,2,1,5,6,7,7,8,8,9,9,6,5)
例如,这里1和2的向量是 b
是对应的对括号,以此类推......
[[[][]]][[[][][]]]
1 1
[[[][]]][[[][][]]]
2 2
如有这方面的意见,非常感谢。
答案
很丑
a <- "[[[][]]][[[][][]]]"
s <- unlist(strsplit(a, ''))
i <- cumsum(s == '[') * (s == '[')
while (any(idx <- i == 0)) {
ii <- min(which(idx))
jj <- table(i[1:ii])
i[ii] <- max(as.integer(names(jj[jj < 2])))
}
i
# [1] 1 2 3 3 4 4 2 1 5 6 7 7 8 8 9 9 6 5
另一答案
@rawr,没有。这个 是丑陋的。
library(data.table)
d = data.table(x = strsplit(a, "")[[1]])
d[ , g := cumsum(shift(cumsum(x == "[") == cumsum(x == "]"), fill = FALSE))]
d[ , ix := d[d[ , .I[1:(.N / 2)], by = g]$V1, {
i = cumsum(x == "[")
c(i, rev(i))}, by = g]$V1]
d[ , pair := .GRP, by = .(ix, (rowid(ix) - 1) %/% 2)]
我想速度不是问题 但出于好奇,我发现我的... data.table
在大弦上更快,例如。a = paste(rep("[[[][]]][[[][][]]]", 1000), collapse = "")
.
all.equal(d$pair, i)
# TRUE
以上是关于查找并标注匹配的括号对的主要内容,如果未能解决你的问题,请参考以下文章