括号匹配2019

题面:

发现了一个由'('和')'组成的环,他想知道如果将环从某处断开,得到的序列有没有可能让括号能够匹配。比如环"))(("可以拆成"))((" "())(" "(())" ")(()"四种,其中"(())"的括号就能够匹配,另外三种则不能。
请你帮他设计一个程序,可以知道,由括号组成的环能不能得到一个可以匹配的序列。

思路:

1、先在最后复制一次,再以’(‘为起始点,验证以l为长度的序列是否匹配

2、因为串是可以循环的,那么只要其左括号和右括号的数量相等,这个串就是匹配的(就一定会有一种方法可以匹配)

直接暴力判断左括号和右括号数量是否匹配即可

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int l,f,k;
 4 stack<char>c;
 5 string s;
 6 int main()
 7 {
 8     while (cin>>s)
 9     {
10         k=0;
11         l=s.length();
12         s=s+s;
13         for (int i=0; i<l; i++)
14         {
15             f=0;
16             while (c.size()) c.pop();
17             if (s[i]=='(')
18             {
19                 for (int j=i; j<l+i; j++)
20                 {
21                     if (s[j]=='(')
22                     {
23                         c.push(s[j]);
24                     }
25                     else
26                     {
27                         if (c.size()==0)
28                         {
29                             f=1;
30                             break;
31                         }
32                         c.pop();
33                     }
34                 }
35             }
36             else continue;
37             if (f==0&&c.size()==0)
38             {
39                 k=1;
40                 printf("YES\n");
41                 break;
42             }
43         }
44         if (k==0) printf("NO\n");
45     }
46 }
View Code

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char c[100010];
 4 int l,k,k1;
 5 int main(){
 6     scanf("%s",c);
 7     l=strlen(c);
 8     for (int i=0;i<l;i++){
 9         if (c[i]=='(') k++;else k1++;
10     }
11     if (k1==k){
12         printf("YES\n");
13     }else{
14         printf("NO\n");
15     }
16 }
View Code

 

posted @ 2019-07-14 19:54  Snow_in_winer  阅读(217)  评论(0编辑  收藏  举报