题意:
给一个字符串,仅有( )组成
(()),()都称为简单字符串,因为前一半是(,后一半是)
从字符串选出的字符能组成简单字符串,则可以把它从字符串中删除
问最少删几次原字符串,使得它不能再删除了
思路:
刚开始读错题,以为是删除最少的次数,使得字符串最短,浪费好多时间写了又改
实际它就是删除到不能再删除,不用管咋删除的,那实际上能删的话,删一次就可以了,我们从定义一个l=1,r=n,从左边找一个(,右边找一个),记录在数组中,直到l,r相遇,
如果数组里没有元素,即没找到配对的,那直接输出0即可
代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <map>
#include <queue>
#include <set>
#include <stack>
typedef long long ll;
#define PII make_pair
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int MAXN=2e5+50;
const int inf=0x3f3f3f3f;
const int M=5000*4;
char ch[1050];
int p[1050];
int f[1050];
int main()
{
cin>>(ch+1);
int n=strlen(ch+1);
int l=1,r=n;
int pos=1;
int cnt=0;
while(1){
int gg=0;
while(1){
if(ch[l]==')')
l++;
else {
gg++;//找到一个(
break;
}
if(l>n)break;
}
if(l>n)break;//边界
if(l>=r)break;
while(1){
if(ch[r]=='(')
r--;
else {
gg++;//找到一个)
break;
}
if(r<=0)break;//边界
}
if(r<=0)break;
if(r<=l)break;
if(gg==2){
p[++cnt]=l;
p[++cnt]=r;
l++;
r--;
}//找不到满足的就break,说明没有了
else break;
}
sort(p+1,p+cnt+1);//按顺序输出
if(cnt==0){
cout<<0<<endl;
}
else
{
cout<<1<<endl;
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++)
i!=cnt?cout<<p[i]<<" ":cout<<p[i]<<endl;
}
return 0;
}