模拟赛

串(string)

【题目描述】
给定一个由小写字母组成的字符串 s,每次你可以删去它的一个非回文子串,
求删成空串的最小次数。
【输入数据】
第一行一个整数 t 表示数据组数。
每组数据第一行一个整数 n 表示字符串长度,第二行一个字符串 s。
【输出数据】
每组数据输出一行一个整数表示答案,如果无法删成空串输出-1。
【样例输入】
2
7
abcdcba
3
xxx
【样例输出】
2
-1
【样例解释】
对于第一个样例,一种最优方案为 abcdcba->adcba->空串。
【数据范围】
对于 30%的数据,n<=10。
对于 60%的数据,n<=100。
对于 100%的数据,t<=20,n<=10^5。

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 110
#define INF 0x7fffffff
using namespace std;
int ans;
struct node{
    string s;
    int len;
};
void solve(node now,int step){//已经进行了step次 
    if(step>=ans)return;
    for(int l=0;l<now.len;l++){
        for(int r=l+1;r<now.len;r++){
            int ll=l,rr=r;bool flag=0;
            while(ll<=rr){
                if(now.s[ll]!=now.s[rr]){flag=1;break;}
                else ll++,rr--;
            }
            if(flag==0)continue;
            node nxt;nxt.s="";nxt.len=0;
            for(int i=0;i<l;i++)nxt.s+=now.s[i],nxt.len++;
            for(int i=r+1;i<now.len;i++)nxt.s+=now.s[i],nxt.len++;
            if(nxt.len==0){
                ans=min(ans,step+1);
                return;
            }
            solve(nxt,step+1);
        }
    }
}
int main(){
//    freopen("Cola.txt","r",stdin);
    freopen("string.in","r",stdin);freopen("string.out","w",stdout);
    int T;
    scanf("%d",&T);
    while(T--){
        ans=INF;
        node str;
        scanf("%d",&str.len);cin>>str.s;
        solve(str,0);
        if(ans<INF)printf("%d\n",ans);
        else puts("-1");
    }
    return 0;
}
30分 暴力

相关文章:

  • 2022-12-23
  • 2022-02-16
  • 2021-10-19
  • 2021-09-17
  • 2021-03-31
  • 2022-02-12
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-10-11
  • 2022-12-23
  • 2021-10-06
  • 2022-12-23
  • 2021-07-07
相关资源
相似解决方案