678. 有效的括号字符串
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
- 任何左括号 ( 必须有相应的右括号 )。
- 任何右括号 ) 必须有相应的左括号 ( 。
- 左括号 ( 必须在对应的右括号之前 )。
-
- 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
- 一个空字符串也被视为有效字符串。
示例 1:输入: "()"
输出: True
示例 2:输入: "(*)"
输出: True
示例 3:输入: "(*))"
输出: True
注意:
字符串大小将在 [1,100] 范围内。
解题思路
使用贪心算法,维护一个左括号的最大值和最小值
- 当遇到(,左括号的数目加一,无论是最大值或者最小值
- 当遇到),左括号的数目减去一,无论是最大值或者最小值。如果最大值小于0了,说明即使把所有的*换成(,也无法满足)的需求
- 当遇到*,我们可以将其当成(或者),当成),就需要把最小值减去1,因为消掉了一个(。当成(,就需要把最大值加上1
代码
class Solution {public boolean checkValidString(String s) {int del=0,lMax=0,lMin=0,i=0,n=s.length();while(i<n){if(s.charAt(i)=='('){lMax++;lMin++;}else if(s.charAt(i)==')'){lMax--;lMin=Math.max(0,lMin-1);if(lMax<0)return false;}else {lMax++;lMin=Math.max(0,lMin-1);}i++;}return lMin==0;}
}