CodeForces - 1305 B. Kuroni and Simple Strings(字符串)

传送门

题意:

给一个字符串,仅有( )组成
(()),()都称为简单字符串,因为前一半是(,后一半是)
从字符串选出的字符能组成简单字符串,则可以把它从字符串中删除
问最少删几次原字符串,使得它不能再删除了

思路:

刚开始读错题,以为是删除最少的次数,使得字符串最短,浪费好多时间写了又改
实际它就是删除到不能再删除,不用管咋删除的,那实际上能删的话,删一次就可以了,我们从定义一个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;
} 
发布了158 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44091178/article/details/104647809