寻找回文字符串

★什么是回文串

就是正读与反读都相同的字符串。像werrrew这样的字符串。

★寻找字符串中最长的回文串

◇需要解决的问题

1、字符串输入与保存

字符串的输入函数有好多个,但是各自都有各自的限制。

scanf函数遇到“空格”和“TAB”键就终止输入;

getchar函数输入单个字符;

gets函数虽然能输入字符串,但是却没有指明读取的最大字符串数,很有可能读写到非法内存!

fgetc(stdin)与getchar函数等价

fgets(buf,MANX,stdin)则可以读取一整行放到数组buf中,因为此函数读到‘\n’时就会停止。

2、字母以外的字符处理

判断时忽略标点符号。可以使用函数isalpha(),此函数可以判断字符是否为字母。同时可以使用toupper()函数将大小写字母转化为同样的字母。该函数的头文件都为ctype.h

3、判断回文串

回文串的判断方法:可以从两边向内判断,也可以从内向两边判断

◇代码设计

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAXN 5000 + 10

int main()
{
    char buf_a[MAXN],buf_b[MAXN];
    int i,j,k,len,max,x,y,p[MAXN];
    fgets(buf_a,sizeof(buf_a),stdin);
    len = strlen(buf_a);

    k = 0;
    for(i = 0;i < len;i++)
    {
        if(isalpha(buf_a[i]))
        {
            buf_b[k] = toupper(buf_a[i]);
            p[k++] = i;
        }
    }

    max = 0;
    for(i = 0;i < len;i++)
    {
        for(j = 0;j <= i && i+j < len;j++)
        {
            if(buf_b[i-j] != buf_b[i+j]) break;
            if(max < 2*j+1)
            {
                max = 2*j+1;
                x = p[i-j];
                y = p[i+j];
            }
        }
        for(j = 0;j <= i && i+j+1<len;j++)
        {
            if(buf_b[i-j] != buf_b[i+j+1]) break;
            if(max < 2*(j+1))
            {
                max = 2*(j+1);
                x = p[i-j];
                y = p[i+j+1];
            }
        }
    }
    for(i = x;i <= y;i++)
    {
        printf("%c",buf_a[i]);

    }
    return 0;
}

★总结

◇思考

思考后得到的东西才是自己的,理解的也深刻,这也是学习能力的关键!遇到问题时不要急于寻求答案,可以将它看作为一次自我挑战,坚持独立思考,持续思考,问题多解,相信最终会受益的!

◇分析问题

我们遇到问题的阻碍之时,不能笼统的最自己说:这个问题我解决不了!我们要做的时分析,那么应该怎样分析呢?

1、拆分问题

一个问题解决不了,可能是因为其中的一个小问题的阻碍。就像上述问题,就起码包括三个小问题!多字符串的输入、字符串的处理、回文串的判断!正确的将问题拆分,将有利于问题的解决。

2、正确描述问题

正确的描述出自己所遇到的问题,有益于问题的解决!常问自己:我遇到的问题到底是什么?要解决这个问题还缺少什么?

3、确定问题的属性

知识层面的问题就是书本上或者网上能轻易查找到的!像什么叫回文串?

逻辑层面的问题必须通过自己的总结或者推理去探索的,不能够在书本或者网上轻易找到的问题!而逻辑层面的问题要比知识层面的问题要重要的多,也是重点去解决的问题

◇善于总结

要习惯将类似的知识点去做一下对比,找出各自的限制。区分相同点和不同点,这样会对知识有更深的了解!

◇问题多解

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值