【LeetCode 32】Longest Valid Parentheses【H】
来源:互联网 发布:网络摄像头电脑客户端 编辑:程序博客网 时间:2024/06/16 18:23
求所给字符串中合理的括号串的最大长度。(所给字符串只包含 ‘(’ 和 ‘)’ )
1.动态规划算法(DP)
定义数组 longest:先根据所给字符串 s 的长度来申请创建一个一维的 int 型数组 longest 。longest[i] 表示一个合理括号串的长度,该合理括号串是以 s[i] 为结尾的。
如何进行迭代:
1. 若 s[i] == ‘(‘,那么 longest[i] = 0;
2. 若 s[i] == ‘)’,那么要分2种情况:
2.1 若 s[i-1] == '(',那么 longest[i] = longest[i-1] + 22.2 若 s[i-1] == ')',那么我们需要做一个判断:s[i-1-longest[i-1]] =?= '(',如果等于,那么说明 s[i-1-longest[i-1]] 能够与 s[i] 配对为 '()',于是有下面的迭代:longest[i] = longest[i-1] + 2 + longest[i-2-longest[i-1]];否则,longest[i] = 0。
说明:对于1,若最后一位是 ‘(‘,那么最长的合理括号串的长度肯定为0,即不存在;对于2.1,如果最后一位是 ‘)’ 并且它的前一位是 ‘(‘,那么两者刚好能形成一个合理的括号串,由此可以迭代出:longest[i] = longest[i-1] + 2;对于2.2,此时最后2位是 ‘))’ 的形式,如果判断结果是 true,那么说明 s[i-1-longest[i-1]] 能够与 s[i] 配对为 ‘()’,即表明 s[i-1-longest[i-1]] 和 s[i] 之间的括号都是合理的,此后我们再加上 longest[i-2-longest[i-1]] ,就完成了迭代。
如何赋予初值:
longest[0] = 0
longest[1] = (s.charAt(0)==’(’ && s.charAt(1)==’)’) ? 2 : 0
需要注意的点:
防止数组的越界,在相应的地方需要做一下判断。
Java代码如下:
public int longestValidParentheses(String s) { int len = s.length(); if (len == 0 || len == 1) { return 0; } int[] longest = new int[len]; longest[0] = 0; longest[1] = (s.charAt(0)=='(' && s.charAt(1)==')') ? 2 : 0; int ret = longest[1]; for (int i = 2; i < len; i++) { if (s.charAt(i) == '(') { longest[i] = 0; // continue; } else { if (s.charAt(i-1) == '(') { // s[i-1] = '(' && s[i] = ')' longest[i] = longest[i-2] + 2; ret = Math.max(ret, longest[i]); } else { // s[i-1] = ')' && s[i] = ')' if (i-1-longest[i-1] >= 0 && s.charAt(i-1-longest[i-1]) == '(') { longest[i] = longest[i-1] + 2 + ((i-2-longest[i-1] >= 0) ? longest[i-2-longest[i-1]] : 0); ret = Math.max(ret, longest[i]); } else { longest[i] = 0; } } } } return ret;
2.使用 Stack(栈)
注意压入栈中的是序号(index),而不是字符
代码源自:https://discuss.leetcode.com/topic/7234/simple-java-solution-o-n-time-one-stack/
public class Solution { public int longestValidParentheses(String s) { LinkedList<Integer> stack = new LinkedList<>(); int result = 0; stack.push(-1); for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == ')' && stack.size() > 1 && s.charAt(stack.peek()) == '(') { stack.pop(); result = Math.max(result, i - stack.peek()); } else { stack.push(i); } } return result; }}
阅读全文
0 0
- 【LeetCode 32】Longest Valid Parentheses【H】
- LeetCode(32)Longest Valid Parentheses
- [Leetcode] #32 Longest Valid Parentheses
- [Leetcode] 32 - Longest Valid Parentheses
- LeetCode 32 Longest Valid Parentheses
- Leetcode 32 Longest Valid Parentheses
- leetcode 32 -- Longest Valid Parentheses
- LeetCode---(32)Longest Valid Parentheses
- leetcode 32 : Longest Valid Parentheses
- leetcode 32: Longest Valid Parentheses
- [leetcode 32]Longest Valid Parentheses
- LeetCode-32 Longest Valid Parentheses
- Leetcode #32 Longest Valid Parentheses
- Leetcode#32||Longest Valid Parentheses
- leetcode-32 Longest Valid Parentheses
- leetcode 32:Longest Valid Parentheses
- LeetCode 32: Longest Valid Parentheses
- Leetcode 32 - Longest Valid Parentheses
- 剑指offer SQL训练
- 2017/9/16随笔--Jquery源码解读
- Javascript 事件,思维导图
- CCF CSP 201509-1 数列分段(Java-100分)
- HTML学习整理
- 【LeetCode 32】Longest Valid Parentheses【H】
- MySQL ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'
- c#知识扩展篇
- Linux 下 lua 开发环境安装及安装 luafilesystem
- CSS学习整理
- jdk1.8 + tomcat8 + mysql5.6 安装(Centos6)
- 树莓派3 串口使用 raspberry pi 3B+ uart boot overlay(最全树莓派串口使用)
- Oracle中分区表的常用视图
- linux命令_系统管理_date