整理判断回文字符串

回复http://ask.csdn.net/questions/242433#answer_230412#

写算法前的分析:判断一个字符串是否可能是回文串,除了可以按定义的从前读和从后读都是一样外,还可以这样理解从头递增尾递减的字符都相等,无关其字符数量。
按照之上理解,则可从头尾比较中执行判断和交换,就用mamad为例,不用编译器就可以写个大概代码:
char 字符串[]={'m','a','m','a','d'},交换('-');
 int 头(0),尾(4),标头(0),标尾(0);
 while(头<尾)
 if(字符串[头]!=字符串[尾])
 {
 标头=头;标尾=尾;
 while(字符串[标头]!=字符串[标尾]&&标头<=标尾)++标头;
 if(标头!=标尾)
 {
 交换=字符串[头];字符串[头]=字符串[标头];字符串[标头]=交换;
 ++头;--尾;
 }
 else
 {
 标头=头;
 while(字符串[标头]!=字符串[标尾]&&标头<=标尾)--标尾;
 if(标头!=标尾)
 {
 交换=字符串[尾];字符串[尾]=字符串[标尾];字符串[标尾]=交换;
 ++头;--尾;
 }
 else
 {不是回文串;break;}
 }
 }

按照逻辑写个框架大概,接着就是上机调试,直到得到正确的算法为止,按之上写的代码的逻辑希望来说,就mamad这个字符串,确实只需要一次交换即可。当 标尾==2时,d被存储,m被交换到4,d被交换当2;接着外循环1和3相等,结束判断。

上机调试后的完整算法:
 	char 字符串[] = "dmamad", 交换('-');
	int 头(0), 尾(5), 标头(0), 标尾(0);
	while (头<尾)
	if (字符串[头] != 字符串[尾])
	{
		标头 = 头; 标尾 = 尾;
		while (字符串[标头] != 字符串[标尾] && 标头 <= 标尾)++标头;
		if (标头 != 标尾)
		{
			交换 = 字符串[头]; 字符串[头] = 字符串[标头]; 字符串[标头] = 交换;
			++头; --尾;
		}
		else
		{
			标头 = 头;
			while (字符串[标头] != 字符串[标尾] && 标头 <= 标尾)--标尾;
			if (标头 != 标尾)
			{
				交换 = 字符串[尾]; 字符串[尾] = 字符串[标尾]; 字符串[标尾] = 交换;
				++头; --尾;
			}
			else
			{
				std::cout << "不是回文串" << endl; break;
			}
		}
	}
	else
	{
		++头; --尾;
	}
	std::cout << 字符串 << endl;

稍加整理优化代码:

void 整理判断回文(char 字符串[])
{
	char 交换('-');
	int 头(0), 尾 = strlen(字符串) - 1, 标头(0), 标尾(0), 换向(0);
	while (头 < 尾)
	if (字符串[头] != 字符串[尾])
	{
		标头 = 头; 标尾 = 尾;
		继续:
		while (字符串[标头] != 字符串[标尾] && 标头 <= 标尾) if (!换向) ++标头; else --标尾;
		if (标头 != 标尾)
		{
			交换 = 字符串[(换向 ? 尾 : 头)];
			字符串[(换向 ? 尾 : 头)] = 字符串[(换向 ? 标尾 : 标头)];
			字符串[(换向 ? 标尾 : 标头)] = 交换;
			++头; --尾; 换向 = 0; std::cout << "位置交换:" << 字符串 << endl;
		}
		else if (!换向)
		{ 标头 = 头; ++换向; goto 继续;	}
		else
		{ std::cout << "不是回文串:" << 字符串 << endl; break; }
	}
	else
	{ ++头; --尾; }
}
	char 字符串1[]="mamad";
	整理判断回文(字符串1);
	char 字符串2[]="dmama";
	整理判断回文(字符串2);
	char 字符串3[]="dmamad";
	整理判断回文(字符串3);
	char 字符串4[]="dmamamamad";
	整理判断回文(字符串4);
 char 字符串5[] = "dmamamamamad";
 整理判断回文(字符串5);


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值