当前位置:编程学习 > C/C++ >>

C++找字符串直接后继

存在三十六个字符{0, 1, 2, . . . , 9, a, b, c, . . . , z}.字符串由这三十六个字符组成,模仿数学中的进制,找到这个字符串的直接后继,
例如a的后继是b,aaa的后继是aab。。。。。

我的算法是,从后往前,遍历字符串,如果是逆序的,就没有后继
否则,找到第一个非逆序的字符,和之前遍历的字符中比它大,而且最接近的那个和他交换,再将其余遍历字符由小到大排序

例如,kaka7ba642,后往前第一个非逆序的是7,7与6交换,7ba42再由小到大排序为247ab,所以直接后继是kaka247ab。

Sample Input 
12
03snd3fk5ee2
gfedcba987
036420

Sample Output 
12 -> 21
03snd3fk5ee2 -> 03snd3fke25e
gfedcba987 -> no successor/*没有后继的时候*/
036420 -> 040236

我写了个半成品的代码:
#include"stdio.h"
#include"string.h"
#include"math.h"
int main()

{char a[100];
int n,i,j,t,tt,m=0,min=10000,temp;

while(scanf("%s",a)!=EOF)
{
    n=strlen(a);
   if(n==1) { printf("%c -> no successor\n",a[0]);}
   else{
       printf("%s ->",a);
       for(i=n-1;i>0;i--)
         {if(a[i-1]<a[i])
             { t=i-1;m=1;break;}/*m=1,表示找到第一个非逆序的元素*/
          }
        if(m==0) printf("no successor\n");

        if(m==1) { for(j=i;j<n;j++)
                  if((a[j]>a[i-1])&&(('a[j]'-'a[i-1]')<min))
                   {
                    'a[j]'-'a[i-1]'=min; tt=j;     /*报错,找后面比改字符大又最接近的怎么找呢,这里我不会写,这里就当作伪代码看吧*/  
                   }
                  }
                    temp=a[t];a[t]=a[tt];a[tt]=temp;
                    for(j=t+1;j<n;j++)
                    {for(i=t+1;i<n;i++)
                     {if(a[j]>a[i])
                      {temp=a[i];a[i]=a[j];a[j]=temp;}/*顺请教冒泡排序是这么写的么?有人告诉我qsort(),这个函数怎么用么?*/
                     }
                    }  
                  
                printf("%s\n",a);
         }
   }
   
return 0;   
}
答案:#include <iostream> //找字符串的直接后继 
#include <string>
#include <math.h>
#include <conio.h>
using namespace std;

int main()
{
    char a[100];
   
    int n,i,j,k,t,m=0,w;
    char temp;

    if(scanf("%s",a))
    {
        n=strlen(a);
        if(n==1)
        {
            cout<<a[0]<<" -> no successor"<<endl;
        }
        else
        {
            printf("%s -> ",a);
            for(i=n-1;i>0;i--)
            {
                if(a[i-1]<a[i])
                {
                    m=1;
                    w=a[i-1];
                    break;
                }/*m=1,表示找到第一个非逆序的元素*/
            }

            if(m==0)
            {
                cout<<"no successor"<<endl;
            }

            if(m==1) //把从第n-1到第i个元素中第一个比第i-1个大的元素放在第i-1位置上,最后对第i到第n元素升序排列
            {
                     for(t=n-1;t>i-1;t--)
                     if(a[t]>w)
                     {
                                  int temp=a[i-1];
                                  a[i-1]=a[t];
                                  a[t]=temp;
                                  break;
                     }
                     k=n-1; //冒泡排序
                     int lastexchange;
                     while(k>i)
                     {
                       
                        for(j=i;j<k;j++)
                           if(a[j]>a[j+1])
                           {
                                  int temp=a[j];
                                  a[j]=a[j+1];
                                  a[j+1]=temp;
                                  lastexchange=j;
                           }
                       
                           k=lastexchange;
                     }
                     for(int i=0;i<n;i++)
                     cout<< a[i];
                     cout<<endl;          
            }       
            getch();
            return 0;
            }
}
}

上一个:c++整数类问题
下一个:C++编程高手进

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,