Leetcode_32_最长有效括号_栈/dp/贪心

看了编程的思路后写的,和标程基本一样
我觉得这个压入-1的操作,不是一般人能想到的
第一遍写的时候用的是Stack,但所用时间是deque的两倍

dp的话是最容易想到的,但方程的推到略有难度

最后一种巧妙的贪心,个人觉得也很难想到orz

class Solution {
    public int longestValidParentheses(String s) {
        Deque<Integer>stack = new ArrayDeque<Integer>();
        stack.push(-1);
        int len = s.length();
        int ans = 0;
        for(int i=0;i<len;i++) {
            if(s.charAt(i)=='(') {
                stack.push(i);
            } else {
                stack.pop();
                if(stack.isEmpty()) {
                    stack.push(i);
                } else {
                    ans = Math.max(ans,i-stack.peek());
                }
            }
        }
        return ans;
    }
}

2021/9/6 dp写法

没有十年脑血栓绝对写不出这个dp,写的我快自闭了。其实两个更新操作真的不难想,我一个小时前刚看题,就想到了,一个是()匹配,另一个是和之前的某个(匹配。比较容易踩坑的是要记得加上dp[end-1]。最后发现这两种情况都可以合并orz。

class Solution {
    public int longestValidParentheses(String s) {
        int len = s.length();
        int[] dp = new int[len];
        int ans = 0;
        for (int end = 1; end < len; end++) {
            if (s.charAt(end) == '(') {
                continue;
            }
            int bef = end - dp[end - 1] - 1;
            if (bef >= 0 && s.charAt(bef) == '(') {
                dp[end] = dp[end - 1] + 2 + dp[Math.max(bef - 1, 0)];
                if (dp[end] > ans) {
                    ans = dp[end];
                }
            }
        }
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值