原则:任意位置左边的左括号的数量必须小于等于右括号的数量。
先统计一遍左括号的数量和右括号的数量,将除了最后一个#号外的#号全填一个右括号,剩下的在最后一个#号处补齐。
然后扫一遍判断是否满足原则。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
char s[100100];
int ans[100100];
int left_num=0;
int main(){
scanf("%s",s);
int size=(int)strlen(s);
int cnt=0;
int left=0,right=0;
for(int i=0;i<size;++i){
if(s[i]=='(') {
++left;
++left_num;
}
else if(s[i]==')') {
++right;
--left_num;
if(left_num<0){
printf("-1\n");
return 0;
}
}
else {
if(left_num<=0){
printf("-1\n");
return 0;
}
--left_num;
++cnt;
}
}
int left1=0,right1=0;
for(int i=size-1;i>=0;--i){
if(s[i]=='(') ++left1;
else if(s[i]==')') ++right1;
else break;
}
if(left1>right1){
printf("-1\n");
return 0;
}
if(left-right<cnt) printf("-1\n");
else {
int k=0;
for(int i=0;i<cnt-1;++i){
ans[k++]=1;
}
ans[cnt-1]=left-right-cnt+1;
int tmp=0;
k=0;
for(int i=0;i<size;++i){
if(s[i]=='('){
++tmp;
}
else if(s[i]==')'){
--tmp;
if(tmp<0) {
printf("-1\n");
return 0;
}
}
else{
tmp-=ans[k];
++k;
if(tmp<0){
printf("-1\n");
return 0;
}
}
}
for(int i=0;i<cnt;++i){
printf("%d\n",ans[i]);
}
}
return 0;
}
整理了一下思路将代码重写了一下,如下
/*************************************************************************
> File Name: 494A_.cpp
> Author: UnknownCUnknown
> Mail: jsnjhcb@icloud.com
> Created Time: 二 2/ 3 13:30:09 2015
************************************************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <list>
#include <string>
#include <cstdlib>
#include <queue>
#include <cmath>
#include <climits>
using namespace std;
char s[100010];
int main(){
gets(s);
int size=(int)strlen(s);
int l=0,r=0;
int lastp=-1;
int jn=0;
for(int i=0;i<size;++i){
if(s[i]=='(') ++l;
else if(s[i]==')') ++r;
else {
++jn;
lastp=i;
}
}
if(l>=r+jn){
int tmp=l-(r+jn)+1;
int le=0,ri=0;
bool flag=false;
for(int i=0;i<size;++i){
if(s[i]=='(')++le;
else if(s[i]==')') ++ri;
else{
if(i==lastp) ri+=tmp;
else ++ri;
}
if(ri>le){
flag=true;
puts("-1");
break;
}
}
if(!flag&&ri==le){
for(int i=0;i<jn-1;++i){
puts("1");
}
printf("%d\n",tmp);
}else if(!flag){
puts("-1");
}
}
else puts("-1");
return 0;
}