来自M78的光之文轩 2022-11-04 10:08 采纳率: 92%
浏览 47
已结题

NOI的1.7的34:回文子串代码找不到错误

NOI的1.7的34:回文子串代码找不到错误
原题在http://noi.openjudge.cn/ch0107/34/

#include<iostream>
#include<string.h>
int huiwen(char a[]){
    int t=strlen(a)-1,e=1;
    for(int i=0;i<=t-i;i++){    //写一个判断是否为回文的函数 
        if(a[i]!=a[t-i]) e=0;  //是则返回1,不是返回0 
    }
    return e;
}
using namespace std;
int main(){
    char s[500]={0},a[500]={0},b[250][500]={0};   //s用来输入总字符串,a用来承接s的每一小部分,b用来存放回文字符串 
    cin.getline(s,500);
    int i,k,l,I=0;
    for(i=0;i<strlen(s);i++){                //每次先确定开头 
        for(k=0,l=0;k<strlen(s)-i;k++){      //从s[i]开始每个小循环逐渐往后+1 
            a[l++]=s[i+k];                      //给a赋值,从s[i]到s[i+k]
            if(k!=0&&huiwen(a)==1) strcpy(b[I++],a);  //k!=0排除1个字符的情况 
        }
        for(l=0;l<500;l++) a[l]='\0';     //清空a中上个循环留下的字符 
    }
    for(i=0;i<I;i++){
        for(l=0;l<I-1-i;l++){
            if(strlen(b[l])>strlen(b[l+1])) swap(b[l],b[l+1]);
        }
    }
    for(i=0;i<I;i++) cout<<b[i]<<endl;
}

  • 写回答

4条回答 默认 最新

  • 关注

    有两个问题:
    (1)排序的时候会改变字符串原来的位置,所以每次增加回文串的时候,需要采用插入排序
    (2)回文串的个数可能会大于500,比如输入500个a的时候
    代码修改如下:

    #include <iostream>
    #include <string.h>
    using namespace std;
    typedef struct _datainfo
    {
        int len;
        char data[502];
    }Hwc;
    
    //插入
    void Insert(Hwc a[], char* c, int n)
    {
        int len = strlen(c);
    
        if (n == 0)
        {
            strcpy(a[0].data, c);
            a[0].len = len;
            return;
        }
    
        if ( len >= a[n-1].len)
        {
            strcpy(a[n].data, c);
            a[n].len = len;
            return;
        }
        for (int i = 0; i < n; i++)
        {
            if (len < a[i].len)
            {
                for (int j = n; j > i; j--)
                    a[j] = a[j - 1];
                strcpy(a[i].data, c);
                a[i].len = len;
                break;
            }
        }
    }
    
    int huiwen(char a[]) {
        int t = strlen(a) - 1;
        for (int i = 0; i < t; i++, t--) {    //写一个判断是否为回文的函数 
            if (a[i] != a[t])
                return 0;  //是则返回1,不是返回0 
        }
        return 1;
    }
    
    int main() {
        char s[502] = { 0 }, a[502] = { 0 };//s用来输入总字符串,a用来承接s的每一小部分,
        Hwc b[2600];   //b用来存放回文字符串 
        cin.getline(s, 502);
        int i, k, l, I = 0;
        for (i = 0; i < strlen(s); i++) {                //每次先确定开头 
            for (k = 0, l = 0; k < strlen(s) - i; k++) {      //从s[i]开始每个小循环逐渐往后+1 
                a[l++] = s[i + k];                      //给a赋值,从s[i]到s[i+k]
                if (k != 0 && huiwen(a) == 1) {
                    Insert(b, a, I);
                    I++;
                };  //k!=0排除1个字符的情况
            }
    
            for (l = 0; l < 502; l++) a[l] = '\0';     //清空a中上个循环留下的字符 
        }
        
        for (i = 0; i < I; i++) cout << b[i].data << endl;
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月12日
  • 已采纳回答 11月4日
  • 创建了问题 11月4日

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)