题目描述
(括号题真的好烦人) 讲道理,题目一看,大概率就是用dp做
代码 & 解析
1. 栈做法
这个做法我没实际写,但是感觉很厉害,就记录一下。 我们之前做括号正确判断的时候,就用到了栈来进行匹配判断。 如今也可以用栈来进行正确判断,并记录下可行的括号的下标, 比如(1,4)(2,3)(7,8),得到142378,而后一次排序O(nlogn),得到123478。 在这个有序数组中找到最长连续子串即可。 (当然,这里可以优化成O(n),排序用其他方法代替。)
2. 动态规划
class Solution { public int longestValidParentheses ( String s) { if ( s == null || s. length ( ) == 0 ) { return 0 ; } int ans = 0 ; int len = s. length ( ) ; int [ ] dp = new int [ len] ; for ( int i= 0 ; i< len; i++ ) { char ch = s. charAt ( i) ; if ( i > 0 && ch == ')' ) { if ( s. charAt ( i- 1 ) == '(' ) { dp[ i] = i- 2 >= 0 ? dp[ i- 2 ] + 2 : 2 ; } else { int left = i - dp[ i- 1 ] - 1 ; if ( left >= 0 && s. charAt ( left) == '(' ) { dp[ i] = left- 1 >= 0 ? dp[ i- 1 ] + 2 + dp[ left- 1 ] : dp[ i- 1 ] + 2 ; } } ans = Math . max ( dp[ i] , ans) ; } } return ans; }
}
class Solution { public int longestValidParentheses ( String s) { if ( s == null || s. length ( ) == 0 ) { return 0 ; } int ans = 0 ; int len = s. length ( ) ; int [ ] dp = new int [ len] ; for ( int i= 0 ; i< len; i++ ) { char ch = s. charAt ( i) ; if ( i > 0 && ch == ')' ) { if ( s. charAt ( i - 1 ) == '(' ) { dp[ i] = i - 2 >= 0 ? dp[ i - 2 ] + 2 : 2 ; } else { int left = i - dp[ i - 1 ] - 1 ; if ( left >= 0 && s. charAt ( left) == '(' ) { dp[ i] = left - 1 >= 0 ? dp[ i - 1 ] + 2 + dp[ left - 1 ] : dp[ i - 1 ] + 2 ; } } ans = Math . max ( dp[ i] , ans) ; } } return ans; }
}