UVA 146 ID Codes

本文介绍了如何通过编程实现寻找给定字符串下一个排列的方法,详细解释了解题思路和核心步骤,包括找到第一个能和后面字符交换的数,并进行交换及后续排序。

题意:给定一个字符串,求它的下一个排列

解题思路:从后面开始找,找第一个能和后面字符交换的数(字典序比前面的大)。然后交换,再对后面的位排一次序就行了(其实直接可以用c++的next函数)

解题代码:

// File Name: uva146.c
// Author: darkdream
// Created Time: 2013年07月11日 星期四 10时48分42秒

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<ctype.h>
int cmp(const void *a , const void *b)
{
    return *(char *)a -*(char *)b;
}
char str[100];

int main(){

    //freopen("/home/plac/problem/input.txt","r",stdin);
    //freopen("/home/plac/problem/output.txt","w",stdout);
    while(scanf("%s",str) != EOF)
    {
        if(strlen(str) == 1 && str[0] == '#')
            break;
        int ok =0 ;
        int len = strlen(str);
        int siti = 0 ;
        int sitj = 0 ; 
        for(int j = len -1; j >= 0 ;j --)
        {
            for(int i = j; i >= 0 ;i -- )
            {
                if(str[i] < str[j])
                {
                    sitj = j ;
                    siti = i ;
                    ok = 1;
                    break;
                }
            }
            if(ok)
                break;
        }
        if(ok == 0 )
        {
            printf("No Successor\n");
            continue;
        }
        char temp = str[sitj];
        str[sitj] = str[siti];
        str[siti] = temp;
        qsort(str+siti+1,len-1-siti,sizeof(char),cmp);
        printf("%s\n",str);

    }

    return 0 ;
}
View Code

 

转载于:https://www.cnblogs.com/zyue/p/3183787.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值