按照字典序生成全排列

说到排列,肯定先想到生成排列,这一节讲如何按照字典序法生成数字的全排列或者某一排列的下一排列。

原理如上,给个题目如何?
题目传送门
题意很简单,代码如下:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    string s;
    while(cin>>s)
    {
        if(s[0]=='#')   
        break;
        int key=-1;
        int len=s.length();
        for(int i=len-1;i>0;i--)
        {
            if(s[i]>s[i-1])    //这里找到最后一组升序对
            {
                key=i-1;
                break;
            }
        }
        
         if(key==-1)
            {
                cout<<"No Successor"<<endl; //如果没找到的话说明已经是最后一个排列了
                continue;
            }
        else 
        {
            for(int i=len-1;i>key;i--)
            {
                if(s[i]>s[key])     //按照原理找到最后一个大于s[i]的数
                {
                    //cout<<i<<" "<<key<<endl;
                    char c=s[i];
                    s[i]=s[key];
                    s[key]=c;
                    break;
                }
            }
            char ch[1000];
            for(int i=key+1;i<len;i++)
            ch[i]=s[i];
            for(int i=key+1;i<len;i++)
            s[i]=ch[len-i+key];
            cout<<s<<endl;
        }
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容