寻找输入的回文字符串并输出!!

/*
*函数功能:提取给定字符串中的回文字符串
*算法复杂度:O(n^2)
*返回:找到了回文字符串就输出,找不到就什么都不输出
*限制:认定大小写的字符有区别,认定空格等特殊字符会影响回文串的判定
*说明:对回文字符串的重叠现象(eg:abcdedcbcd)做了处理,平时我们很容易忽视这一点
*思路:2个迭代器变量,一个从前往后遍历(i),另一个从后向前找相同字符(position),找到相同字符
就判断两个字符间的字符串是否是回文字符串,如果是,则把positon存起来,用来和下次的遍历作比较,因为
回文字符串的字串也可看作回文串;否则,进入下一次循环。
*/
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024

typedef enum {false, true}  bool;

int GetSameChar(char a[], char ch, int startpos ,int endpos);
bool IsSymmetry(char a[], int startpos, int endpos);
void GetSymmetry(char a[]);


int main()
{
    char a[MAXSIZE] = {0};
    scanf("%s", a);
    GetSymmetry(a);
    return 0;
}


//寻找相同字符并返回索引值
int GetSameChar(char a[], char ch, int startpos ,int endpos)
{
    endpos--;
    while((a[endpos]) != ch && endpos > startpos)
    {
        endpos--;
    }
    if(startpos == endpos)
        return 0;
    else
        return endpos;
}
//判断一个字符是否是回文字符串
bool IsSymmetry(char a[], int startpos, int endpos)
{
    if(endpos <= startpos)
        return false;
    for(startpos++,endpos--; startpos < endpos; startpos++,endpos--)
    {
        if(a[startpos] != a[endpos])
            return false;
    }
    return true;
}
//获取一串字符中的回文字符
void GetSymmetry(char a[])
{
    const int SIZE = strlen(a);
    int i,position,oldposition;
    oldposition = 0; //avoid partion
    for(i=0; i<SIZE; i++)
    {
        position = SIZE;
        while((position=GetSameChar(a, a[i], i, position)) != 0)
        {
            if(position <= oldposition)
                break;
            if(IsSymmetry(a, i, position))
            {
                oldposition = position;
                printf("Find it! From %2d  to %2d : ", i, position);
                int tmp = i;
                for(; tmp<=position; tmp++)
                   printf("%c", a[tmp]);
                printf("\n");
                break;
            }
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值