678. Valid Parenthesis String

Given a string containing only three types of characters: '(', ')' and '*', write a function to check whether this string is valid. We define the validity of a string by these rules:

  1. Any left parenthesis'('must have a corresponding right parenthesis')'.

  2. Any right parenthesis')'must have a corresponding left parenthesis'('.

  3. Left parenthesis'('must go before the corresponding right parenthesis')'.

  4. '*'could be treated as a single right parenthesis')'or a single left parenthesis'('or an empty string.

  5. An empty string is also valid.

Example 1:

Input: "()"

Output: True

Example 2:

Input: "(*)"

Output: True

Example 3:

Input: "(*))"

Output: True

Thoughts:

  1. DP

  2. "two counter": min_op_left: how many open "(" if regarding all * to be ")"; max_op_left: how many open "(" if regarding all * to be "("

    1. key idea: max_op_left should always be >= 0 in order to be considered legal, otherwise it will have unbalanced ")" and the parenthesis will never be balanced by further appending any char after it.

Code: unordered DP with memoization Time: O(n^3) Space: O(n^2), Top-Down

Code: Ordered DP with memoization Time: O(n^3) Space: O(n^2), Bottom Up

Code Counting Time: O(n), Space: O(1)

Python

Special Thanks to Huahua's blog

Last updated

Was this helpful?