// 回文.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;
}
算法基础——判断一个字符串至多添加一个字符之后是否回文
最新推荐文章于 2022-05-12 21:38:28 发布