uva 146 ID Codes

求给出字符串的下一序列。


法一:直接利用c++中next_permutation函数,(算法竞赛经典入门P187)


#include "stdio.h"
#include "algorithm"
#include "string.h"
using namespace std;
int main(){
	char str[1000];
	int len;
	bool flag;
	while(scanf("%s",str))
	{
		len=strlen(str);
		flag=0;
		if(str[0]=='#') break;
		while(next_permutation(str,str+len))//next_permutation布尔型
		{
			flag=1;break;
		}
		if(flag) printf("%s\n",str);
        else printf("No Successor\n");

	}
	return 0;
}



法二:


#include "stdio.h"
#include "algorithm"
#include "string.h"
using namespace std;
int main()
{
    int i,s;
    char str[1024],t;
    while(gets(str))
    {
        if(str[0]=='#') break;
        int len=strlen(str);
        for(i=len-1; i>0; i--)//从后向前找第一个后面字母比前面字母大的字母M
        {
            if(str[i-1]<str[i]) break;
        }
        if(i==0)//字典序最大
        {
            printf("No Successor\n");
            continue;
        }
        s=i;
        for(i=len-1; i>=s; i--)//M之后找比它大的字母中最小的
        {
            if(str[i]>str[s-1])

            {
                t=str[i];
                str[i]=str[s-1];
                str[s-1]=t;
                break;
            }
        }
        sort(str+s,str+len);//M字母后面的字母按升序排列
        printf("%s\n",str);
    }
return 0;
}




你可能感兴趣的:(uva 146 ID Codes)