有效的括号字符串-LeetCode

时间:2019-12-29 14:14:20

标签: string algorithm dynamic-programming

我正在研究与here链接的LeetCode相关的问题。

给出一个仅包含三种类型的字符的字符串:'(',')'和'*',编写一个函数来检查该字符串是否有效。我们通过以下规则定义字符串的有效性:

  1. 任何左括号'('必须具有相应的右括号')'。
  2. 任何右括号')'必须具有相应的左括号'('。
  3. 左括号'('必须在相应的右括号')之前。
  4. '*'可被视为单个右括号')'或单个左括号'('或一个空字符串。
  5. 空字符串也是有效的。
  

示例:

     

输入:“(*))”

     

输出:

我已经阅读了文章中指定的方法,但是我无法理解与动态编程有关的方法2 。谁能解释我们如何通过动态编程解决问题?预先感谢!

主要痛点:

  

或者,可以将s [i]设为'(',并且[i + 1,j]中有一些k,使得s [k]可以设为')',再加上两个间隔可以使被s [k](s [i + 1:k]和s [k + 1:j + 1])剪切的有效;

1 个答案:

答案 0 :(得分:0)

我不确定我们可以更清楚地说明您共享的LeetCode链接中已经提供的解释。针对动态程序的规定公式为

Let dp[i][j] be true if and only if
the interval s[i], s[i+1], ..., s[j]
can be made valid.

首先要考虑的是,任何有效的括号结构都可以简化为一个独立的有效部分的组合,每个部分都具有自己左右平衡的末端。例如,

((()())())

在深度1处有两个内部部分:

(valid_A valid_B)
  where valid_A is (()())
    and valid_B is ()

根据问题描述,可以将*做成一个空字符串。这将涵盖动态程序制定中的第一种情况,

dp[i][j] is true if:
  s[i] is '*', and the interval
  s[i+1], s[i+2], ..., s[j]
  can be made valid

因为我们将查看从s[i+1]s[j]的输入中已经有效或“自包含”的部分,并且不添加任何内容(空字符串)。 / p>

有效性的第二种情况是s[i]可以是(还是有效部分的开始,在这种情况下,如果我们可以确定其特定的平衡结束括号) ,在s[k]处,我们现在可以确定的两个部分必须每个都有效,以便整个部分都有效。以前面的例子为例,

((()())())
 i    k j

并使用您共享的语言:

if s[i] can be made to be '(',
and there is some k in [i+1, j] such
that s[k] can be made to be ')'

我们拥有的

(()())()
i    k j

“ ......加上s[k]s[i+1: k]s[k+1: j+1])削减的两个间隔...”

()() -> that's i+1...k-1

and

()   -> that's k+1...j

“ ...可以设为有效;”那么整个s[i..j]部分都是有效的。