查找并标注匹配的括号对

问题描述 投票:2回答:2

给定以下一串嵌套的小括号。

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

如有这方面的意见,非常感谢。

r string
2个回答
4
投票

很丑

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

1
投票

@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
© www.soinside.com 2019 - 2024. All rights reserved.