题面:
发现了一个由'('和')'组成的环,他想知道如果将环从某处断开,得到的序列有没有可能让括号能够匹配。比如环"))(("可以拆成"))((" "())(" "(())" ")(()"四种,其中"(())"的括号就能够匹配,另外三种则不能。
请你帮他设计一个程序,可以知道,由括号组成的环能不能得到一个可以匹配的序列。
思路:
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 "); 41 break; 42 } 43 } 44 if (k==0) printf("NO "); 45 } 46 }
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 "); 13 }else{ 14 printf("NO "); 15 } 16 }