我有一个问题要完成这个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所以请耐心等待我。感谢
答案 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
的第二个参数的正则表达式也应传递给strapply
。 pre
中的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替换清单。然后运行cumsum
和Max
(从上面)。
library(gsubfn)
fn$sapply(strapply(x, "[()]", list("(" = +1, ")" = -1), empty = 0), ~ Max(cumsum(x)))
## [1] 3 4 0 0 -1 -1