我正在研究与here链接的LeetCode相关的问题。
给出一个仅包含三种类型的字符的字符串:'(',')'和'*',编写一个函数来检查该字符串是否有效。我们通过以下规则定义字符串的有效性:
示例:
输入:“(*))”
输出:是
我已经阅读了文章中指定的方法,但是我无法理解与动态编程有关的方法2 。谁能解释我们如何通过动态编程解决问题?预先感谢!
主要痛点:
或者,可以将s [i]设为'(',并且[i + 1,j]中有一些k,使得s [k]可以设为')',再加上两个间隔可以使被s [k](s [i + 1:k]和s [k + 1:j + 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]
部分都是有效的。