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
");
            continue;
        }
        char temp = str[sitj];
        str[sitj] = str[siti];
        str[siti] = temp;
        qsort(str+siti+1,len-1-siti,sizeof(char),cmp);
        printf("%s
",str);

    }

    return 0 ;
}
View Code
没有梦想,何谈远方
原文地址:https://www.cnblogs.com/zyue/p/3183787.html