C/C++教程

Acwing 4198. 最长合法括号子串

本文主要是介绍Acwing 4198. 最长合法括号子串,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e6+5;
 4 int dp[N];//dp[i]表示以i结尾的最长合法串长度; dp[i]转移,考虑当前i为')' 栈里只压入'('则dp[i]=dp[j-1]+i-j+1;j-1如果合法那么可以合并
 5 int main()
 6 {
 7   string s;
 8   cin>>s;
 9   int ans=0,cnt=1;
10   stack<int>st;
11   int n=s.size();
12   memset(dp,0,sizeof(dp));
13   for(int i=0;i<n;i++)
14   {
15     if(s[i]=='(')st.push(i);
16     else
17     {
18       if(st.size())
19       {
20         int j=st.top();
21         st.pop();
22         dp[i]=dp[j-1]+i-j+1;
23         if(dp[i]==ans)cnt++;
24         else if(dp[i]>ans)
25         {
26           ans=dp[i];
27           cnt=1;
28         }
29       }
30     }
31   }
32   cout<<ans<<" "<<cnt;
33   return 0;
34 }

 

这篇关于Acwing 4198. 最长合法括号子串的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!