题意:
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
Related Topics 字符串 动态规划
解题思路
1.设置一个数组,里面存放字符串中每个字符对应位置()的最大值
2.判断字符串当前位置的最大值,主要看两种情况
2.1一种以()结尾的
这种情况看当前位置的前两个位置,字符的状态。累加2即可
2.2 一种以))结尾的,但是可以构成(((())))这种字符串
这种情况要累加倒数第二个)的状态,和符合(((())))字符串之前()的转态,在2.1基础上累加即可。
代码:
class Solution {
public int longestValidParentheses(String s) {
int res=0;
//用来记录字符串中每个字符对应位置()的最大值
int[] dp=new int[s.length()];
for (int i = 1; i < s.length(); i++) {
if(s.charAt(i)==')')
{
//步骤2.1()结尾的
if(s.charAt(i-1)=='(')
dp[i]= (i>=2 ? dp[i-2] : 0) +2;
//以))结尾的,需要找到对应的(,以及判断之前是否有)并判断状态数值大小
else if(i-dp[i-1]-1>=0&&s.charAt(i-dp[i-1]-1)=='(')
dp[i]=dp[i-1]+( i-dp[i-1]-2>=0 ? dp[i-dp[i-1]-2] : 0)+2;
res=Math.max(res,dp[i]);
}
}
return res;
}
}
效果
info
解答成功:
执行耗时:2 ms,击败了74.72% 的Java用户
内存消耗:38.3 MB,击败了83.68% 的Java用户