1089.Valid Parenthesis String
Input: "()"
Output: True
Input: "(*)"
Output: True
Input: "(*))"
Output: True
这道题应该怎么做?用栈当然不行。因为这个题不能精确到每一个符号。
没有星号的情况自然不必说。O(n)走一遍,保证当前(左括号数量-右括号数量)>=0。左括号的数量多一点没关系,因为后面还可以有右括号来补。但是如果当前右括号就多了,那就已经false了。
并且遍历结束的时候==0。
但是有星号的情况下,就不好判断星号是当做左括号来用还是当做右括号来用还是不用。
因此我们在遍历的时候,要记录两个数量。
1.left。当前为左括号的时候,l++。当前为星号的时候,l—-。当前为右括号的时候l—。
它代表的意思是什么呢?左括号累加,遇到星号的时候,把星号当做右括号使用。但是不会减到负值(如果超出了就把星号当做空值来算)
遇到右括号的时候,减。但是不会减到负值。
它其实就是用来表示一个最差的情况,即左括号很多,星号全部被当做右括号使用
2.cp。把星号都当做左括号来使用,cp++。遇到右括号cp—-。如果减到负值,说明已经false了。
public class Solution {
/**
* @param s: the given string
* @return: whether this string is valid
*/
public boolean checkValidString(String s) {
// Write your code here
int len = s.length();
int l=0, cp=0;
for (int i=0; i<len; i++) {
if (s.charAt(i) == '(') {
l++;
cp++;
}
else if (s.charAt(i) == '*') {
if (l > 0) {
l--;
}
cp++;
}
else {
if (l > 0) {
l--;
}
cp--;
if (cp < 0) {
return false;
}
}
}
return l == 0? true: false;
}
}