题目
字符串中找最长合法括号子串
代码
public class Solution {
public int longestValidParentheses(String s) {
if(s == null || s.length() <=1){
return 0;
}
int n = s.length();
int[] record = new int[n];
int ans = 0;
for(int i=1;i<n;i++){
char curChar = s.charAt(i);
char preChar = s.charAt(i-1);
if(curChar == ')'){
if(preChar == '('){
int ppreIndex = i-2;
record[i]=(ppreIndex>=0 ? (record[ppreIndex]+2):2);
}
else{
int farpreIndex = i-record[i-1]-1;
if((farpreIndex>=0 ) && (s.charAt(farpreIndex)=='(')){
record[i]=record[i-1] + 2 + ((i-record[i-1]-2>=0 )?record[i-record[i-1]-2]:0);
}
}
ans = Math.max(record[i],ans);
}
}
return ans;
}
}
思考
1 有几种方法来做,关键点是明白左括号,或者右括号多出来都不能成为一个合法字串。
2 我选择的方法是数组记录DP。每位代表到这个点结尾的字符串,若合法,则记录数据。
2.a 当遇到'(' 不用理睬,因为最后一位( 不是合法字符串
2.b 当遇到‘)’ 看前一位是否'(' 若是,则匹配它,新字符串最长位它前一位+2;若否,则匹配更前面的'(‘
3其他方法
3.1有用堆栈记录index来找寻匹配括号
3.2 堆栈记录未能匹配的括号,然后最长间隔即为答案
3.3 分别记录从左到右和从右到左,这样就能去掉多余的括号计算