算法基础——判断一个字符串至多添加一个字符之后是否回文

// 回文.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

/*
判断一个字符串最多添加一个字符之后是否可以变成回文
返回值:0表示不可以,1可以。

注意点:代码要覆盖到成为回文的所有情况——
(1)本身就是回文
(2)在后部添加字符构成回文
(2)在前部添加字符构成回文

以上情况返回1,其他自然就要返回0
*/
int can_be_huiwen(char c[], int len)
{
    char *p1 = c;
    char *p2 = c+len-1;
    while(p1 < p2)
    {
        if(*p1 == *p2)
        {
            p1++;
            p2--;
        }
        else
        {
            //遇到不相等的字符,这时要构成回文只有添加一个字符到p1前面或在p2,两种方法不一样,都要验证

            char * tmp1 = p1, *tmp2 = p2;   //先缓存,以供第二种(可能)使用

            //(1)在p2后面添加
            p1++;
            int b1 = 1;             //因为第一种情况不满足还需尝试第二种情况,所以这里需要一个返回的判断条件
            while(p1 < p2)
            {
                p1++;
                p2--;
                if(*p1 != *p2)
                    b1 = 0;
            }
            if(b1 == 1)             //b1依然是1说明方法(1)构成了回文,直接返回1,否则继续尝试第二种方法
                return 1;

            //(2)在p1前面添加
            tmp2--;
            while(tmp1 < tmp2)
            {
                tmp1++;
                tmp2--;
                if(*tmp1 != *tmp2)
                    return 0;
            }
            break;                  //没有返回0,执行到这里,说明添加字符构成了回文,不用再循环,直接执行到函数尾部返回1
        }
    }

    return 1;                       //前面可能的return没执行才会执行到这里,说明*p1 == *p2始终成立,本身就是回文,返回1
}

void keep_window_open()
{
    char c;
    scanf("%c", &c);
}

int _tmain(int argc, _TCHAR* argv[])
{
    char* s= "123453421";
    int  n = can_be_huiwen(s, 9);
    printf("%d\n",n);

    keep_window_open();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值