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第36题(合并两个排序的链表)


下一篇:Python实现的常用排序方法