在字符串R代码中查找嵌套括号的最大深度

时间:2018-04-15 09:29:33

标签: r nested parentheses

我有一个问题要完成这个R代码。我们给出了一个带有如下括号的字符串      “(((X))(((Y))))” 我们需要找到平衡括号的最大深度,如上例中的4。因为'Y'被4个平衡括号包围。

如果括号不平衡,则返回-1 我的代码如下所示:

current_max = 0
max = 0
def = function (S){
  n=S
  for (i in nchar(n))
    if (is.element('(',n[i]))
    {
      current_max <- current_max + 1   
    }
  if (current_max > max)
      {
        max <- current_max
      }
  else if (is.element(')',n[i]))
  {
    if (current_max > 0)
    {
      current_max <- current_max - 1
    }
    else
    {
      return -1
    }
  }
  if (current_max != 0)
  {
    return -1
  }
  return (max)
}

但是当我调用函数def(“((((B)))”时,答案应为2.但每次它显示0时,即使括号不平衡。我不确定代码是否正确或错误在哪里。我想学习R所以请耐心等待我。感谢

2 个答案:

答案 0 :(得分:4)

如果x <- "( ((X)) (((Y))) )",则删除所有非括号并拆分成字符......

y <- unlist(strsplit(gsub("[^\\(\\)]", "", x), ""))

y
 [1] "(" "(" "(" ")" ")" "(" "(" "(" ")" ")" ")" ")"

然后最大嵌套是+1的最高累积和(对于()和-1(对于))...

z <- max(cumsum(ifelse(y=="(", 1, -1)))

z
 [1] 4

如果括号不平衡,则sum(ifelse(y=="(", 1, -1)))将不等于零。

答案 1 :(得分:0)

以下是三种解决方案。它们都是矢量化的,即输入x可以是一个字符向量,它们都处理没有正确括号的情况。

1)gsubfn包中的strapply / proto strapply匹配作为运行原型对象fun中的函数p的第二个参数的正则表达式也应传递给strapplypre中的p函数初始化输入x的每个组件的计算。 proto对象可用于保留过去匹配的内存(此处lev是嵌套级别),允许进行计数。我们在每个字符串中附加一个任意字符"X",以确保始终至少有一个匹配项。如果我们知道没有零长度字符串输入,则可以省略。 sapply使用Max获取返回深度的最大值,如果没有余额则返回-1。

library(gsubfn) # also pulls in proto

# test input
x <- c("(A((B)))", "((A) ((())) (B))", "abc", "", "(A)((B)", "(A(B)))")


p <- proto(pre = function(.) .$lev <- 0,
           fun = function(., x) .$lev <- .$lev + (x == "(") - (x == ")") )
Max <- function(x) if (tail(x, 1) == 0 && min(x) == 0) max(x) else -1
sapply(strapply(paste(x, "X"), ".", p), Max)
## [1]  3  4  0  0 -1 -1

2)减少这是一个基本解决方案。它使用了来自(1)的Max

fun <- function(lev, char) lev + (char == "(") - (char == ")")
sapply(x, function(x) Max(Reduce(fun, init = 0, unlist(strsplit(x, "")), acc = TRUE)))


    (A((B))) ((A) ((())) (B))              abc                  
           3                4                0                0 
     (A)((B)          (A(B))) 
          -1               -1 

3)strapply / list 另一种可能性是提取括号,并使用()使用strapply返回+1或-1替换清单。然后运行cumsumMax(从上面)。

library(gsubfn)

fn$sapply(strapply(x, "[()]", list("(" = +1, ")" = -1), empty = 0), ~ Max(cumsum(x)))
## [1]  3  4  0  0 -1 -1