String 有效的括号字符串-LeetCode
我正在讨论关于LeetCode链接的问题 给定一个仅包含三种字符类型的字符串:“(”、“)”和“*”,请编写一个函数来检查此字符串是否有效。我们通过以下规则定义字符串的有效性:String 有效的括号字符串-LeetCode,string,algorithm,dynamic-programming,String,Algorithm,Dynamic Programming,我正在讨论关于LeetCode链接的问题 给定一个仅包含三种字符类型的字符串:“(”、“)”和“*”,请编写一个函数来检查此字符串是否有效。我们通过以下规则定义字符串的有效性: 任何左括号“(“必须有相应的右括号”) 任何右括号“)”都必须有相应的左括号“(” 左括号“(“必须在相应的右括号之前”) “*”可以被视为单个右括号“)”或单个左括号“(”或空字符串 空字符串也是有效的 示例: 输入:“(*)” 输出:真 我已经阅读了文章中指定的方法,但我无法理解与动态规划相关的方法2。有人能解释一下
我不确定我们能把你分享的LeetCode链接中已经提供的解释说清楚多少。动态程序的规定公式如下:
Let dp[i][j] be true if and only if
the interval s[i], s[i+1], ..., s[j]
can be made valid.
首先考虑任何一个有效的括号结构可以简化为一个自包含的有效部分的组合,每一个都有自己的左右平衡端。比如说,
((()())())
((()())())
i k j
在深度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]
,并且不向其中添加任何内容(空字符串)
有效性的第二种情况是,如果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]
)切割的两个间隔……”;其中s[i:j]
表示区间s[i],s[i+1],…,s[j-1]
()() -> that's i+1...k-1
and
() -> that's k+1...j
“…可以成为有效的”;然后整个部分
s[i..j]
都是有效的。噢,实际上是符号s[i:j]让我困惑。虽然两个指数(i和j)都包含在内。非常感谢。另外,我对答案进行了编辑,以增加清晰度。