kuangbinOJ G I Wanna Be A Palindrome (贪心)

题意:

给出一个串,问能否通过删除一个字符使得整个串变成回文,这个字符要尽量靠前。

题解:

贪心,很容得到。我们这样想,分别设两个指针l=1,r=len;然后不断判断s[l]和s[r]是否相等,相等就缩进,知道某个位置不相等,那么删除的位置肯定是这两个位置中一个,那么就分两种情况删,假设我们删的是l,那么只要判断剩下的串l+1~r是否是回文就可以了。这样做还是不够的,因为会有这样的数据aaba,这样计算出来答案是2,很明显要删的是1,其实我们可以将l指针往前回溯,因为1位置和2位置相同那么删除哪个都可以,但是为了保证靠前,当让删除1的,于是只要while(l>=1&&s[l]==s[l-1])即可。

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define B(x) (1<<(x))
typedef long long ll;
void cmax(int& a,int b){if(b>a)a=b;}
void cmin(int& a,int b){if(b<a)a=b;}
void lcmax(ll& a,ll b){if(b>a)a=b;}
void lcmin(ll& a,ll b){if(b<a)a=b;}
const int oo=0x3f3f3f3f;
const int MOD=1000007;
const int maxn=110000;
char str[maxn];

int main(){
    //freopen("E:\\read.txt","r",stdin);
    int T,f1,f2;
    scanf("%d",&T);
    while(T--){
        scanf("%s",str+1);
        int len=strlen(str+1);
        int l=1,r=len;
        while(l<r){
            if(str[l]!=str[r])
                break;
            l++;
            r--;
        }
        f1=f2=1;
        if(l>=r) printf("No Solution\n");
        else{
            for(int i=l+1,j=r;i<=j;i++,j--)
                if(str[i]!=str[j])f1=0;
            for(int i=l,j=r-1;i<=j;i++,j--)
                if(str[i]!=str[j])f2=0;
            if(f1){
                while(l>=1&&str[l]==str[l-1])l--;
            }
            if(f1) printf("%d\n",l);
            else if(f2) printf("%d\n",r);
            else printf("No Solution\n");
        }
    }
    return 0;
}






你可能感兴趣的:(kuangbinOJ G I Wanna Be A Palindrome (贪心))