patAグレード1040最長の回文部分文字列

正しいコード:

#include <cstdio>
#include <cstring>

const int maxl = 1001;

int main(){
    
    
    char s[maxl];
    fgets(s, maxl, stdin);
    int n;
    for(n=0; n<maxl; n++){
    
    
        if(s[n]=='\n'){
    
    
            s[n] = '\0';
            break;
        }
    }
    bool judge[n][n]={
    
    };
    int ans = 1;
    //边界
    for(int i=0; i<n; i++){
    
    
        judge[i][i] = 1;
        if(i<n-1 && s[i]==s[i+1]){
    
    
            judge[i][i+1] = 1;
            ans = 2;
        }
    }
    //处理顺序
    for(int L=3; L<=n; L++){
    
    
        for(int i=0; i+L-1<n; i++){
    
    
            int j = i + L - 1;
            //状态转移方程
            if(s[i]==s[j] && judge[i+1][j-1]==1){
    
    
                judge[i][j] = 1;
                ans = L;
            }
        }
    }
    printf("%d", ans);
    return 0;
}

次のように、途中で間違いがありました。

for(int L=3; L<=n; L++){
    
    
        for(int i=0; i+L-1<n; i++){
    
    
            int j = i + L - 1;
            //状态转移方程
            if(s[i]==s[j]){
    
    
                judge[i][j] = judge[i+1][j-1];
                ans = L; //错误点:只要s[i]==s[j]都能进来修改ans
            }
        }
    }

おすすめ

転載: blog.csdn.net/sinat_37517996/article/details/104578929
おすすめ