SPOJ 查找下一个回文Palindrome 算法题解

给出一个数值,well,其实不是数值了,而是一大串数字,

比如 98237482340328490328490324893024,非常长的数字。

找出下一个Palindrome,这个Palindrome在数值上要比当前数值大(不能等于)。

如:

9 9 9 9->1 0 0 0 1

1 2 3 4 5 ->1 2 4 2 1

本算法时间效率是O(n),其中n是指数值的位数,不是数值,比如123456789,只有9位,那么本算法接近常数:

#include <iostream>
#include <string>
using namespace std;

bool sPlus1(string &s, int i)
{
	for (; i >= 0 && '9' == s[i]; i--) s[i] = '0';
	if (i < 0)
	{
		s[0] = '1';
		return true;
	}
	else s[i]++;
	return false;
}

string nextPalindrom(string &palin)
{
	int l_cen = 0, r_cen = 0;
	if (palin.size() % 2) 
	{
		l_cen = r_cen = (palin.size()>>1);
	}
	else
	{
		r_cen = (palin.size()>>1);
		l_cen = r_cen-1;
	}

	int i = l_cen, j = r_cen;
	for ( ; i >= 0 && j < palin.size(); i--, j++)
	{
		if (palin[i] != palin[j]) break;//原来这不是>是!=
	}

	bool extra1 = false;
	if (i >= 0 && palin[j] < palin[i])
	{
		palin[j]++;
	}
	else	extra1 = sPlus1(palin, l_cen);

	if (extra1)
	{
		j = r_cen == l_cen? r_cen+1 : r_cen;
		for (; j < palin.size(); j++) palin[j] = '0';
		palin.push_back('1');
	}
	else
	{
		i = l_cen, j = r_cen;
		for (; j < palin.size(); i--, j++) palin[j] = palin[i];
	}
	return palin;
}

void TheNextPalindrome()
{
	string palin;
	long long T = 0;
	cin>>T;
	while (T--)
	{
		cin>>palin;
		cout<<nextPalindrom(palin)<<endl;
	}
}



OJ 参考资料:

http://www.spoj.com/problems/PALIN/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值