【问题标题】:Valid Parenthesis String - LeetCode有效的括号字符串 - LeetCode
【发布时间】:2019-12-29 14:14:20
【问题描述】:

我正在通过链接 here 的 LeetCode 上的问题。

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

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

示例:

输入:“(*))”

输出:

我已经通过文章中指定的方法,但我无法理解与动态编程相关的方法2。谁能解释我们需要如何通过动态编程来解决这个问题?提前致谢!

主要痛点:

或者,s[i]可以做成'(',并且[i+1,j]中有一些k使得s[k]可以做成')',加上两个区间cut by s[k] (s[i+1: k] and s[k+1: j+1]) 可以有效;

【问题讨论】:

    标签: string algorithm dynamic-programming


    【解决方案1】:

    我不确定我们可以使您分享的 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],并且不添加任何内容(空字符串)。

    有效性的第二种情况是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)都是包容性的。谢谢! P.S.我已经编辑了答案以增加清晰度。
    猜你喜欢
    • 1970-01-01
    • 2023-01-28
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2018-01-14
    • 2015-10-01
    • 1970-01-01
    相关资源
    最近更新 更多