P1944 最长括号匹配(DP)

注意数组下标及因下标为负值而造成的数组越界问题。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=1000005;
string s;
int f[N],ans;
int main(){
	cin>>s;
	int len=s.length();
	for(int i=1;i<len;i++){
		if(s[i]=='('||s[i]=='[') continue;
		else{
			if(((s[i]==')'&&s[i-1-f[i-1]]=='(')||(s[i]==']'&&s[i-1-f[i-1]]=='['))&&i-2-f[i-1]>=0){
				f[i]=f[i-1]+2+f[i-f[i-1]-2];
				ans=max(f[i],ans);
			}
		}
	}
	for(int i=0;i<len;i++){
		if(f[i]==ans){
			for(int j=i-ans+1;j<=i;j++){
				printf("%c",s[j]);
			}
			return 0;
		}
	}
	return 0;
}
posted @ 2021-09-28 23:03  dfydn  阅读(23)  评论(0编辑  收藏  举报