Q:给定一个只包含 '('和')' 的字符串,找出最长的包含有效括号的子串的长度。
A:
从左到右开始遍历计数,当遇到左括号时,Left 加 1,右括号时 Right 加1。
对于最长有效的括号的子串,一定是左括号等于右括号时,更新最长结果;
一旦右括号数量超过左括号数量了,说明当前位置不能组成合法括号子串,
Left 和 Right 重置为 0,从后一个字符开始重新计数比较,直到最后一个字符。
这时会发现逻辑上有漏洞,只处理了 Left <= Right 的情况,
对于这种情况 "(()" 时,在遍历结束时左右子括号数都不相等,此时没法更新最长结果,但实际是需要做对比更新的。
此时需要反向遍历一遍 ,采取类似的机制,稍有不同的是此时若 Left 大于 Right 了,则重置 0,这样就可以涵盖所有情况。
public class LongestValid {
public static int getLongestValid(String s){
if(s == null || s.length()==0)
return 0;
int left = 0,right=0,maxValue=0;
for (int i=0;i<s.length();i++){
if(s.charAt(i)=='(')
left++;
else
right++;
if(left<right){
left = 0;right=0;
}
else if(left==right){
maxValue= Math.max(maxValue,2*left);
}
}
left = 0;right=0;
for(int i=s.length()-1;i>=0;i--){
if(s.charAt(i)=='(')
left++;
else
right++;
if(right<left){
left = 0;right=0;
}
else if(left==right){
maxValue= Math.max(maxValue,2*left);
}
}
return maxValue;
}
public static void main(String[] args) {
ArrayList<String> stringArray = new ArrayList<String>();
stringArray.add(null);
stringArray.add("()()()");
stringArray.add("(()()()");
stringArray.add("()()())");
stringArray.add("()()()(");
stringArray.add("(()()())");
stringArray.add(")(()()())");
stringArray.add("(()())())");
stringArray.add("(()()))())");
for(int i=0;i<stringArray.size();i++){
System.out.println(stringArray.get(i)+" max value is :"+getLongestValid(stringArray.get(i)));
}
}
}
控制台输出
null max value is :0
()()() max value is :6
(()()() max value is :6
()()()) max value is :6
()()()( max value is :6
(()()()) max value is :8
)(()()()) max value is :8
(()())()) max value is :8
(()()))()) max value is :6
网友评论