题目:已知一个字符串都是由左括号(和右括号)组成,判断该字符串是否是有效的括号组合。
例子:
有效的括号组合:()(),(()),(()())
无效的括号组合:(,()),((),()(()
题目进阶:
已知一个字符串都是由左括号(和右括号)组成,返回最长有效括号子串的长度。
第一问很简单,设置一个状态量,遇到"(" +1,遇到")" -1即可,在-1的时候一旦减到<0时,则直接返回false,因为那样不管后面是什么,前
面已经不符合规则了,最后返回status是否=0即可
public static boolean isValid(String str){ if (str == null || str.length() == 0) { return false; } char[] chas=str.toCharArray(); int status=0; for (int i=0;i<chas.length;i++){ if (chas[i] != '(' && chas[i] != ')') { return false; } if (chas[i] == ')' && --status < 0) { return false; } if (chas[i]=='(') { status++; } } return status==0; }
进阶问题则难了不少,解释起来就是判断当前最近满足的再加上起前面一组,前面一组不满足则加0,否则加前面一组长度,解释起来好麻烦
直接上代码
public static int maxLength(String str){
if (str == null || str.length() == 0) {
return 0;
}
char[] chas=str.toCharArray();
int[] dp=new int[chas.length];
int pre=0;
int res=0;
for (int i=1;i<chas.length;i++){
if (chas[i] == ')') {
pre=i-dp[i-1]-1;
if (pre >= 0 && chas[pre] == '(') {
dp[i]=dp[i-1]+2+(pre>0?dp[pre-1]:0);
}
}
res=Math.max(res,dp[i]);
}
return res;
}