小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
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;
}
}
- 时间复杂度:O(n),其中 n 是字符串 s 的长度。需要遍历字符串一次。
- 空间复杂度:O(1)。