国内简约网站,广东省建设信息网三类人员,建网站和开发网站,制学网网站文章目录题目描述代码 解析1. 栈做法2. 动态规划题目描述
#xff08;括号题真的好烦人#xff09;讲道理#xff0c;题目一看#xff0c;大概率就是用dp做
代码 解析
1. 栈做法
这个做法我没实际写#xff0c;但是感觉很厉害#xff0c;就记录一下。我…
文章目录题目描述代码 解析1. 栈做法2. 动态规划题目描述
括号题真的好烦人讲道理题目一看大概率就是用dp做
代码 解析
1. 栈做法
这个做法我没实际写但是感觉很厉害就记录一下。我们之前做括号正确判断的时候就用到了栈来进行匹配判断。 如今也可以用栈来进行正确判断并记录下可行的括号的下标 比如142378得到142378而后一次排序O(nlogn)得到123478。 在这个有序数组中找到最长连续子串即可。 当然这里可以优化成O(n)排序用其他方法代替。
2. 动态规划
具体见注释
/*** 使用dp做法* 我是觉得难点在于考虑dp数组的设计一维、二维* 以及dp数组存储值代表的意思* 再就是循环的设计头到尾、尾到头、短到长* 最后是状态转移方程的设计这个要根据实际问题来感觉是最难的* 1. 有哪几种转移情况(分类真的不容易要找出最合适的分类并且要分类包括所有情况)* 2. 为什么转移为什么可以这么转移
*/class Solution {public int longestValidParentheses(String s) {if (s null || s.length() 0){return 0;}int ans 0;int len s.length();// dp[i]代表以s.charAt[i]结尾的最长有效括号int[] dp new int[len];// O(n)for (int i0; ilen; i){char ch s.charAt(i);// 这种情况肯定是0xxxxxxx...(以这玩意结尾必然无效可以省略不写默认为0/*if(ch (){dp[i] 0;}*/// )有两种情况if(i 0 ch )){// 刚好契合的情况构成xxxxxx()if(s.charAt(i-1) () {// 加上之前的最长有效括号dp[i] i-2 0? dp[i-2] 2 : 2;}// xxxxxx))的情况else{// 用【】来代表dp[i]组成的括号xx【xxxxx)】// 此时 s.charAt[i - dp[i-1]-1]可能是数组越界或者是(、)int left i - dp[i-1]-1;if(left 0 s.charAt(left)(){dp[i] left-10?dp[i-1]2dp[left-1] : dp[i-1] 2;// x【中延续x的长度}/* //可以省略默认0else{dp[i] 0;}*/}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();// dp[i]以s.charAt[i]结尾的最长有效括号int[] dp new int[len];// O(n)for (int i0; ilen; i){char ch s.charAt(i);// Case 1: xx(以(结尾必然无效默认为0// Case 2: )有两种情况if(i 0 ch )){// 刚好契合的情况构成xxxxxx()if(s.charAt(i - 1) () {// 加上之前的最长有效括号dp[i] i - 2 0 ? dp[i - 2] 2 : 2;}// xxxxxx))的情况else{// 用【】来代表dp[i]组成的括号xx【xxxxx)】// 此时 s.charAt[i - dp[i-1]-1]可能是数组越界或者是(、)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;// x【中延续x的长度}// else 为默认0省略不写}ans Math.max(dp[i], ans);}}return ans;}
}