PATA1040题解

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<map>
#include<set>
#include<cstring>
#include<stdio.h>
using namespace std;
char ch[5000];
int len;
/*  把第三个的判断方法和第二个的暴力方法结合在了一起,通过了*/
int test(int i, int flag) {
    int temp = -1, j, ans=-1e9;
    if(flag == 1) {
        temp = 1;
        j = 1;
        while((i-j>=0) && (i+j<len) && (ch[i-j] == ch[i+j])) {
            j++;
            temp += 2;
        }
        return temp;
    }else {
        if(ch[i-1] == ch[i]) {
            temp = 0;
            j = 1;
            while((i-j>=0) && (i+j-1<len) && (ch[i-j] == ch[i+j-1])) {
            j++;
            temp += 2;
            }
            ans = temp;
        }else if(ch[i+1] == ch[i]) {
            temp = 0;
            j = 1;
            while((i-j+1>=0) && (i+j<len) && (ch[i-j+1] == ch[i+j])) {
            j++;
            temp += 2;
            }
            ans = max(temp,ans);
        }
        return ans;
    }
}
int main() {
    //FILE *fp = fopen("1.txt","r");
    fgets(ch, 2000, stdin);
    len = strlen(ch)-1;
    int cur = 0, ans = 1;
    for(int i = 0; i < len; i++) {
        cur = max(test(i,0),test(i,1));
        ans = max(cur, ans);
    }
    cout << ans;
}
/* 第二个想的暴力解决方法,但是有两个测试点过不去,不知道什么地方错了。。
int main() {
    //FILE *fp = fopen("1.txt","r");
    fgets(ch, 2000, stdin);
    len = strlen(ch)-1;
    int cur = 0, ans = 1;
    for(int i = 0; i < len-1; i++) {
        for(int j = i+1; j < len; j++) {
            cur = 0;
            for(int k = i, l = 0; k <= j; k++, l++) {
                    int rt = j-l, lt = i+l;
                    if(rt == lt) {
                        cur += 1;
                        break;
                    }
            //因为是从两头开始比较,假如中间有不相等的,且遍历之后两端没连起来,就会出现错误,因此最好使用长度枚举。
            

  

if(rt < lt ) break;
else if (ch[rt] != ch[lt]) {
cur = 0;
break;
}


                    if(rt < lt || ch[rt] != ch[lt]) break; 
cur += 2; } ans = max(ans,cur); } } cout << ans; }
*/ /*最初想到的办法,分治,我觉得算法复杂度应该是nlgn,但实际运行起来很慢 int test(int i, int flag) { int temp = -1, j, ans=-1e9; if(flag == 1) { temp = 1; j = 1; while((i-j>=0) && (i+j<len) && (ch[i-j] == ch[i+j])) { j++; temp += 2; } return temp; }else { if(ch[i-1] == ch[i]) { temp = 0; j = 1; while((i-j>=0) && (i+j-1<len) && (ch[i-j] == ch[i+j-1])) { j++; temp += 2; } ans = temp; }else if(ch[i+1] == ch[i]) { temp = 0; j = 1; while((i-j+1>=0) && (i+j<len) && (ch[i-j+1] == ch[i+j])) { j++; temp += 2; } ans = max(temp,ans); } return ans; } } int traverse(int i, int j) { if(i < 0 || j < 0) return 0; if(i > j) return 0; if(i == j) return 1; int mid = (i+j)/2; int ans = max(traverse(i,mid), traverse(i+1,j)); int p = max(test(mid,0),test(mid,1)); return max(ans,p); } int main() { FILE *fp = fopen("1.txt","r"); fgets(ch, 2000, fp); len = strlen(ch) ; cout << traverse(0, len-1); } */

猜你喜欢

转载自www.cnblogs.com/dcklm/p/10349792.html