# 678. Valid Parenthesis String

## 1. Question

Given a string s containing only three types of characters: '(', ')' and '*', return true if s is valid.

The following rules define a valid string:

• Any left parenthesis '(' must have a corresponding right parenthesis ')'.
• Any right parenthesis ')' must have a corresponding left parenthesis '('.
• Left parenthesis '(' must go before the corresponding right parenthesis ')'.
• '*' could be treated as a single right parenthesis ')' or a single left parenthesis '(' or an empty string "".

## 2. Examples

Example 1:

Input: s = "()"
Output: true


Example 2:

Input: s = "(*)"
Output: true


Example 3:

Input: s = "(*))"
Output: true


## 3. Constraints

• 1 <= s.length <= 100
• s[i] is '(', ')' or '*'.

## 5. Solutions

class Solution {
public boolean checkValidString(String s) {
Stack<Integer> left = new Stack<>();
Stack<Integer> star = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch == '(') {
left.push(i);
} else if (ch == '*') {
star.push(i);
} else {
if (!left.isEmpty()) {
left.pop();
} else if (!star.isEmpty()) {
star.pop();
} else {
return false;
}
}
}

while (!left.isEmpty() && !star.isEmpty()) {
if (left.pop() > star.pop()) {
return false;
}
}
return left.isEmpty();
}
}