[Jobdu] 题目1337:寻找最长合法括号序列

题目描述:

给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配;所有的右括号都有唯一的左括号匹配。例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是。

需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数。

输入:

测试数据包括多个,每个测试数据包含两行:

第一行为一个整数N,其中N不会超过10^6。

第二行为一个长度为N的字符串,这个字符串由左括号‘(‘和右括号‘)‘组成。

输出:
对应每个测试案例,输出一行,其中包含两个整数,分别代表最长合法括号序列的长度和个数,中间由空格隔开。若没有合法的子序列存在,则返回0 1。
样例输入:
6
(())()
3
))(
样例输出:
6 1
0 1

用一个bool型的数组来标记匹配情况。

 1 #include <iostream>
 2 #include <stack>
 3 #include <string>
 4 #include <cstring>
 5 using namespace std;
 6
 7 int n;
 8 string s;
 9
10 void getRes() {
11     bool a[s.length()];
12     memset(a, false, s.length());
13     stack<int> st;
14     for (int i = 0; i < s.length(); ++i) {
15         if (s[i] == ‘(‘) {
16             st.push(i);
17         } else {
18             if (!st.empty()) {
19                 a[i] = true;
20                 a[st.top()] = true;
21                 st.pop();
22             }
23         }
24     }
25
26     int max = 0, cnt = 1, tmp = 0;
27     for (int i = 0; i < s.length(); ++i) {
28         if (a[i]) {
29             ++tmp;
30         } else {
31             tmp = 0;
32         }
33         if (max == tmp && max != 0) {
34             ++cnt;
35         } else if (max < tmp) {
36             max = tmp;
37             cnt = 1;
38         }
39     }
40     cout << max << " " << cnt << endl;
41 }
42
43 int main() {
44     while (cin >> n) {
45         cin >> s;
46         getRes();
47     }
48     return 0;
49 }
50
51 /**************************************************************
52     Problem: 1337
53     User: hupo250
54     Language: C++
55     Result: Accepted
56     Time:310 ms
57     Memory:7604 kb
58 ****************************************************************/

[Jobdu] 题目1337:寻找最长合法括号序列

时间: 2024-10-11 15:29:19

[Jobdu] 题目1337:寻找最长合法括号序列的相关文章

九度oj 题目1337:寻找最长合法括号序列

题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的左括号匹配.例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是. 需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数. 输入: 测试数据包括多个,每个测试数据包含两行: 第一行为一个整数N,其中N不会超过10^6. 第二行为一个长度为N的字

九度oj 题目1342:寻找最长合法括号序列II

题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即最长的合法括号序列. 输入: 测试数据包括多个,每个测试数据只有一行,即一个随机的括号序列,该括号序列的长度保证不超过106. 输出: 对于每个测试案例,输出一个整数,表示最后剩下的最长合法括号序列长度. 样例输入: (())() (() 样例输出: 6 2 这个题和1337求的是不一样的代码如下

数据结构大师(求区间最长合法括号子序列)

数据结构大师 时间限制: 1 Sec 内存限制: 128 MB 题目描述 小$Z$是个数据结构高手,这天他得到了一个由左括号和右括号组成的字符串.随之而来的是 \(m\) 次询问,对于第 \(i\) 次询问,小Z需要回答出这个字符串的第$l_i$ 到$r_i$ 个字符组成的字串中最长的合法括号子序列的长度. 小$Z$认为一个由左右括号组成的序列$A$合法,当且仅当其满足至少一个以下条件. $A$为空. $A=(B)$其中$B$是一个合法的括号序列. \(A=BC\),其中$BC$都是合法的括号序

LongestValidParentheses, 求最长合法括号子串长度-----同类问题ValidParentheses,GenerateParentheses

问题描述:求括号字符串中最长合法子串长度.例如:()((),返回2,而不是4. 算法分析:还是利用栈,和判断合法括号对是一样的. 1 public static int longestValidParentheses(String s) { 2 Stack<int[]> stack = new Stack<int[]>(); 3 int result = 0; 4 5 for(int i=0; i<=s.length()-1; i++) 6 { 7 char c = s.ch

字符串空格替换、合法括号序列判断、求最长无重复子串问题

一:字符串空格替换 将字符串中的空格全部替换为"%20".假定该字符串后面有足够的空间存放新增的字符. 如:Mr John Smith->Mr%20John 陷阱:Java玩家可能第一时间想到用split(" ")分割原字符串,然后重新拼接的时候在词间添加"%20".这种思路的不完善之处在于:如果原字符串以空格结尾.或者单词之间不止一个空格,则会导致拼接出来的字符串不符合要求. 解法:该题说明原字符串后面有足够空间(Java玩家可忽略,因为

[leetcode]32. Longest Valid Parentheses最长合法括号子串

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring. Example 1: Input: "(()" Output: 2 Explanation: The longest valid parentheses substring is "()" Example

合法括号序列判断

题目描述 对于一个字符串,请设计一个算法,判断其是否为一个合法的括号串. 给定一个字符串A和它的长度n,请返回一个bool值代表它是否为一个合法的括号串. 测试样例: "(()())",6 返回:true 测试样例: "()a()()",7 返回:false 测试样例: "()(()()",7 返回:false class Parenthesis { public: bool chkParenthesis(string A, int n) { /

字符串练习(七):合法括号序列判断

对于一个字符串,请设计一个算法,判断其是否为一个合法的括号串. 给定一个字符串A和它的长度n,请返回一个bool值代表它是否为一个合法的括号串. 测试样例: "(()())",6 返回:true 测试样例: "()a()()",7 返回:false 测试样例: "()(()()",7 返回:false public class Parenthesis { public boolean chkParenthesis(String A, int n)

矩形网格中寻找最长递增序列

在矩形网格中寻找最长的递增序列 比如如下网格 97,47,56,36 35,57,41,13 89,36,98,75 25,45,26,17 结果要求输出 17, 26, 36, 41, 47, 56, 57, 97 基本想法就是对图中的每一个点都当作起始点试一编 将序列最长的保存起来 最后输出 代码如下 使用java编写 import java.util.ArrayList; public class 最长递增序列 { static int[][] rect={ {97,47,56,36},