【发布时间】:2021-01-20 21:48:34
【问题描述】:
这个问题是对熟悉的堆栈问题 (https://leetcode.com/problems/minimum-add-to-make-parentheses-valid/) 的补充,我们必须返回最小加法数才能使括号字符串有效。但是这个问题只包含'('和')'。如果我们将该问题扩展到其他类型的括号,例如“[”、“]”、“{”、“}”,将会发生什么。我刚刚在朋友之间的讨论中遇到了这个问题,需要有关如何处理的帮助。
例如:[[[{{}]]){)}) -> [[[{{}}]]] (){()}() 在这种情况下,答案是添加 5 个以使其有效。
我想不出合适的方法。我考虑的两种方法是:
-
与普通问题类似,我们在浏览字符串时将打开类型 '('、'{'、'[' 推送到堆栈,如果我们发现关闭类型 ')'、'}'、']'我们检查堆栈的顶部,如果它们相互补充,我们弹出并继续,否则我们增加计数器并继续而不弹出。遍历字符串后,我们将答案输出为计数器和堆栈大小的总和。在这种方法中,上面的示例将不起作用,因为额外的“{”会破坏该方法。
-
另一种方法与上述类似,即。我们推入括号的开始类型,如果我们找到一个结束类型并且如果堆栈的顶部补充它,我们弹出并继续字符串,否则我们将弹出直到我们得到一个匹配的字符串并且每次弹出我们增加计数器。遍历字符串后,总值是计数器和堆栈大小的总和。但这不适用于像 {{{{]}}}} 这样字符 ']' 会弹出所有内容并增加答案的情况。
我也在考虑将这些结合起来,更像是一个动态编程,我们将尽可能地查看最高值或查看直到我们在堆栈中找到匹配项或堆栈是否为空。但我不确定这两个是否是唯一需要考虑的情况。
【问题讨论】:
-
我认为您的动态编程思想是正确的方法。我的建议是您为每种打开类型维护一个计数器,以跟踪当前堆栈中的数量。这样,当你找到一个关闭类型时,你就会知道堆栈中是否有匹配的。如果没有匹配,那么唯一的选择是增加添加的数量,并继续而不弹出。
-
这是一个好主意,但是对于找到匹配的情况,我们必须将其弹出或在此处添加一个新字符,然后找出添加最少的字符?在那种情况下,我想它会变成 O(n^2) 。我会为此编写一个代码,然后我会尝试使用一些测试用例来破解它。我对这种方法唯一怀疑的部分是证明它总是有效的。
-
是的,如果有匹配,代码需要尝试两个选项:要么弹出它,要么添加一个新字符。时间复杂度将取决于需要做出多少这样的决定。保留每种类型的计数器可以减少决策数量。
标签: string algorithm data-structures stack dynamic-programming