给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
任何左括号 ( 必须有相应的右括号 )。
任何右括号 ) 必须有相应的左括号 ( 。
左括号 ( 必须在对应的右括号之前 )。
* 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
一个空字符串也被视为有效字符串。
示例 1:
输入: "()"
输出: True
示例 2:
输入: "(*)"
输出: True
示例 3:
输入: "(*))"
输出: True
注意:
字符串大小将在 [1,100] 范围内。
来源:力扣(LeetCode)
class Solution {
public boolean checkValidString(String s) {
/*
思路:
采用判断和计数方法,算出左右括号的数量,以及判断*代替什么
l代表左括号比较多,*作为右括号时左括号的数量
r代表右括号比较多,*作为左括号时左括号的数量
*/
if (s == null||s.length()==0)
return true;
int l = 0, r = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') { // charAt()方法为返回字符串指定索引处的char值
l++;
r++;
} else if (s.charAt(i) == ')') { //如果l不为空,说明左括号比较多,则l--.同时因为r也是代表左括号的数量,所以相应的r--
if (l > 0) {
l--;
}
r--;
} else {
if (l > 0) { // 如果l不为空,说明左括号比较多,星号作为右括号则l--.同时r是星号作为左括号,所以r++
l--;
}
r++;
}
if (r < 0) // h < 0.说明将*当做左括号也不够,返回false
return false;
}
return l == 0; // 看l == 0,如果不等于0,说明将星号视为右括号也不够左括号数量。
}
}