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

查找字符串R代码中嵌套括号的最大深度,r,nested,parentheses,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_m

我完成这个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)
}
current_max=0
最大值=0
def=功能{
n=S
对于(我在nchar(n))中)
if(is.element('(',n[i]))
{
电流(最大值)
{
最大值(0)
{

当前_max如果
x这里有三种解决方案。它们都是矢量化的,即输入
x
可以是字符向量,并且它们都能正确处理没有括号的情况

gsubfn包中的1)Straply/proto
Straply
与作为第二个参数给出的正则表达式相匹配,该参数在proto对象
p
中运行函数
fun
,该函数也应传递给
Straply
p
中的
pre
函数初始化输入的每个组件
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
3)Straply/list另一种可能是提取括号,并使用带有替换列表的
Straply
返回
。然后运行
cumsum
Max
(从上面)在上面运行

library(gsubfn)

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

我不认为
是。元素('(',n[I])
正在做您认为它正在做的事情!您可能需要
substr(n,I,I)==“(”
最后我完成了代码。现在它显示括号是平衡的还是不平衡的。如果它是平衡的,它显示最大括号,如果它是不平衡的,它显示-1。感谢大家的大力帮助。我真的很感激。这是为所有需要解决这类问题的人编写的最后代码:
sample=function(z){y=match(strsplit(z,”[[1]],c(“,”),0)m@Filip Pittner,
sample(“abc”)
应为0,但给出不同的答案和多个警告。相关的想法是将单个字符与
匹配
y=match(strsplit(x,”[[1]],c(“,”),0)
然后重新编码和cumsum
max(cumsum(c(1,-1)[y]))
我试过了,但当括号不平衡时,它会显示第一个平衡的括号。就像(A)(B))显示1,但它应该显示-1,因为B不平衡。我把它放在函数中,这样我就可以很容易地调用它
sample=function(z){
y=match(strsplit(z)”“)[1]、c(“(”,”)、0)
m这也很好,但还不够。如果括号不平衡,就会出现问题。例如(a)((B)或(a(B)))它应该打印-1,但即使不平衡,它也会打印第一个正确的括号。这只是将
max
替换为一个函数
max
,该函数根据是否存在平衡返回最大值或-1。已经做了更改。谢谢。对于这个问题,我至少有两个解决方案。已经添加了第三个ap接近。
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
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 
library(gsubfn)

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