678_Valid Parenthesis String

678. Valid Parenthesis String

Level: medium

Tag: string

Question

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.

Example1

Input: "()"
Output: True

Example2

Example3

Idea

"*" represent either ( or ). It won't represent both. (Because otherwise they can balance out.)

So there are two major cases that make the string not valid:

  • If * represent ( , scan from left to right. If the number of ) is larger than the total number of * and ( at any point, then this string is invalid.

  • If * represent ), scan from right to left. If the number of ( is larger than the total number of * and ) at any point, then this string is invalid.

Complexity

  • Time:O(n)O(n)

  • Space:O(1)O(1)

Solution

Last updated

Was this helpful?