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位,那么本算法接近常数:

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

#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/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法
, string
, size
, 数值算法
, else
数值
palindrome 算法、回文数算法、c语言回文数算法、回文算法、java回文数算法,以便于您获取更多的相关知识。

时间: 2024-10-30 11:23:05

SPOJ 查找下一个回文Palindrome 算法题解的相关文章

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串.如何删除才能使得回文串最长呢? 输出需要删除的字符个数. 输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000. 输出描述: 对于每组数据,输出一个整数,代表最少需要删除的字符个数. 输入例子: abcda google 输出例子: 2 2 #include <iostream> #include <string.h> #include <algorithm

产生下一个排列数的算法

全排序: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列.例如n=3,全排序为:123.132.213.231.312.321共6种. 字典序法: 对给定的字符集中的字符规定了一个先后关系,在此基础上规定两个全排列的先后是:从左到右逐个比较对应的字符大小.字符集{1,2,3},较小的数字较先,这样按字典序生成的全排列即:123.132.213.231.312.321. 1.现在假设输入全排序中的一串数字

C语言之回文数算法

"回文"是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如"我为人人,人人为我"等.在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number).        设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数.        上代码: #include <stdio.h> #defin

Winform TreeView 查找下一个节点

转载:http://www.cnblogs.com/Ruiky/archive/2013/02/01/2888674.html public static class TreeViewHelper { private static IEnumerable<TreeNode> childNodes(this TreeNode node) { return node.Nodes.Cast<TreeNode>() .SelectMany(x => x.selfAndChildNod

SPOJ Transform the Expression 逆波兰式算法题解

把带括号的一般正常的算式,转换成逆波兰式. 输入和输出如下例子: Input: 3 (a+(b*c)) ((a+b)*(z+x)) ((a+t)*((b+(a+c))^(c+d))) Output: abc*+ ab+zx+* at+bac++cd+^* 总结规律是很困难的事情,总结好就能很快解决: 1 字母直接放结果 2  '('入栈 3 ')' 出栈到'(',然后出栈'(' 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Program

Java实现查找当前字符串最大回文串代码分享_java

先看代码 public class MaxHuiWen { public static void main(String[] args) { // TODO Auto-generated method stub String s = "abb"; MaxHuiWen(s); } //1.输出回文串 public static void MaxHuiWen(String s){ //存储字符串的长度 int length = s.length(); //存储最长的回文串 String M

[LeetCode] Largest Palindrome Product 最大回文串乘积

Find the largest palindrome made from the product of two n-digit numbers. Since the result could be very large, you should return the largest palindrome mod 1337. Example: Input: 2 Output: 987 Explanation: 99 x 91 = 9009, 9009 % 1337 = 987 Note: The

求解:关于回文的一个问题

问题描述 因为新学所以不是很懂代码如下package org.lh.mldn;public class StringDemo {public static void main(String []args) {String st="aabbccddeeccddccbbaa";char st1[]=st.toCharArray();if(comp(st)){System.out.println(st+"是回文");}else{System.out.println(st+

[小米]2015小米校招之回文数判断

[题目]  大家对回文串不陌生吧?一个字符串从前看和从后看如果一样的话,就是回文串,比如"上海自来水来自海上"就是一个回文串.现在我们的问题来了,把一个数字看成字符串,问它是不是一个回文数?时间复杂度和空间复杂度越低的算法,得分越高.c++:     bool isPalindromeNumber(long num);java:     boolean isPalindromeNumber(long num); [代码] #include <iostream> using