Problem Statement
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""
.
Example 1
Input: s = "(*)(*"
Output: true
Try here before watching the video.
Video Solution
Java Code
class Solution {
public boolean checkValidString(String s) {
int openCount = 0;
int closeCount = 0;
int length = s.length() - 1;
for (int i = 0; i <= length; i++) {
if (s.charAt(i) == '(' || s.charAt(i) == '*') {
openCount++;
} else {
openCount--;
}
if (s.charAt(length - i) == ')' || s.charAt(length - i) == '*') {
closeCount++;
} else {
closeCount--;
}
if (openCount < 0 || closeCount < 0) {
return false;
}
}
return true;
}
}
C++ Code
class Solution {
public:
string checkValidString(string s) {
int openCount = 0;
int closeCount = 0;
int length = s.length() - 1;
for (int i = 0; i <= length; i++) {
if (s[i] == '(' || s[i] == '*') {
openCount++;
} else {
openCount--;
}
if (s[length - i] == ')' || s[length - i] == '*') {
closeCount++;
} else {
closeCount--;
}
if (openCount < 0 || closeCount < 0) {
return false;
}
}
return true;
}
};
Python Code
class Solution:
def checkValidString(self, s: str) -> bool:
open_count = 0
close_count = 0
length = len(s) - 1
for i in range(length + 1):
if s[i] == '(' or s[i] == '*':
open_count += 1
else:
open_count -= 1
if s[length - i] == ')' or s[length - i] == '*':
close_count += 1
else:
close_count -= 1
if open_count < 0 or close_count < 0:
return False
return True
Javascript Code
/**
* @param {string} s
* @return {boolean}
*/
var checkValidString = function(s) {
let openCount = 0;
let closeCount = 0;
const length = s.length - 1;
for (let i = 0; i <= length; i++) {
if (s[i] === '(' || s[i] === '*') {
openCount++;
} else {
openCount--;
}
if (s[length - i] === ')' || s[length - i] === '*') {
closeCount++;
} else {
closeCount--;
}
if (openCount < 0 || closeCount < 0) {
return false;
}
}
return true;
};
Go Code
func checkValidString(str string) bool {
openCount := 0
closeCount := 0
length := len(str) - 1
for i := 0; i <= length; i++ {
if str[i] == '(' || str[i] == '*' {
openCount++
} else {
openCount--
}
if str[length-i] == ')' || str[length-i] == '*' {
closeCount++
} else {
closeCount--
}
if openCount < 0 || closeCount < 0 {
return false
}
}
return true
}
Complexity Analysis
Time Complexity: O(N)
Space Complexity: O(1)