-
题目地址:http://ac.jobdu.com/problem.php?pid=1337
-
给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配;所有的右括号都有唯一的左括号匹配。例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是。需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数。
题目描述:
-
输入:
-
测试数据包括多个,每个测试数据包含两行:第一行为一个整数N,其中N不会超过10^6。第二行为一个长度为N的字符串,这个字符串由左括号'('和右括号')'组成。
-
输出:
-
对应每个测试案例,输出一行,其中包含两个整数,分别代表最长合法括号序列的长度和个数,中间由空格隔开。若没有合法的子序列存在,则返回0 1。
-
样例输入:
-
6 (())() 3 ))(
-
样例输出:
-
6 1 0 1
基本思路和题目1153:括号匹配问题一样。
有输入数组,有标志位数组。
发现左右括号匹配的时候,就将当前位置1。
求最大值的时候,循环标志位,发现1连续,就累加,否则就置为0。
同时需要比较大小,累加结果。
C++ AC
#include <stdio.h>
#include <stack>
#include <string>
#include <string.h>
using namespace std;
const int maxn = 1000002;
char input[maxn];
int main(){
int n,i;
while(scanf("%d",&n) != EOF){
scanf("%s",input);
stack<int> symStack;
int *flagArr = new int[n];
memset(flagArr,0,sizeof(flagArr));
for(i = 0 ; i < n; i++){
if(input[i] == '('){
symStack.push(i);
}else if(input[i] == ')' && !symStack.empty()){
int j = symStack.top();
symStack.pop();
flagArr[i] = 1;
flagArr[j] = 1;
}
}
int maxLen = 0;
int count = 0;
int tempLen = 0;
for (i = 0; i < n; i++) {
if (flagArr[i] == 1) {
tempLen ++;
}else {
tempLen = 0;
}
if (tempLen > maxLen) {
maxLen = tempLen;
count = 1;
}else if (tempLen == maxLen) {
count++;
}
}
if(maxLen == 0){
printf("0 1\n");
}else{
printf("%d %d\n",maxLen,count);
}
}
return 0;
}
/**************************************************************
Problem: 1337
User: wangzhenqing
Language: C++
Result: Accepted
Time:100 ms
Memory:10092 kb
****************************************************************/
Java AC
import java.util.Scanner;
import java.util.Stack;
public class Main {
/*
* 1337
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
String a = scanner.next();
char array[] = a.toCharArray();
int flagArr[] = new int[n];
Stack<Integer> stack = new Stack<Integer>();
for (int i = 0; i < n; i++) {
if (array[i] == '(') {
stack.push(i);
}else if (array[i] == ')' && !stack.isEmpty()){
int j = stack.pop();
flagArr[i] = 1;
flagArr[j] = 1;
}
}
int maxLen = 0;
int count = 0;
int tempLen = 0;
for (int i = 0; i < n; i++) {
if (flagArr[i] == 1) {
tempLen ++;
}else {
tempLen = 0;
}
if (tempLen > maxLen) {
maxLen = tempLen;
count = 1;
}else if (tempLen == maxLen) {
count++;
}
}
System.out.println(maxLen == 0 ? "0 1" : maxLen+" "+count);
}
}
}
/**************************************************************
Problem: 1337
User: wzqwsrf
Language: Java
Result: Accepted
Time:2130 ms
Memory:80436 kb
****************************************************************/