全排列算法解析(视频+详解+代码+STL)

全排列生成算法

刚开始自学的时候搜了两三个scdn中关于讲解全排列问题的博客,但是我理解能力比较差还是没有完全理解

,后来就在网上搜索了视频才完全弄懂,现在把我理解的分享给你们。

学习视频:http://v.ku6.com/show/RP7r6vew4Qb_MCF1eYZeOg...html

1、  没有重复字符的全排列问题

例如:对abcd进行全排列

如图:全排列算法解析(视频+详解+代码+STL)_第1张图片

分析:a b c d

1、  定a 对b c d进行全排列 

2、  定 b对a c d进行全排列

3、  定c 对a b d进行全排列

4、  定d 对a b c进行全排列

很明显这个涉及到递归的思想,

#include
#include
using namespace std;
char str[]="abcd";
void permitation(int from,int to)
{
       if(from==to)//相当于a->d后就输出
       {
              for(int i=0;i<=to;i++)
              {
                     cout<

2、  出现重复字符的全排列问题

例如:1223

1-223

2-123

3-221

带重复字符的全排列就是每个字符分别与它后面非重复重现字符的进行交换

即:第i个字符与第j个字符交换时,要求[I,j)中没有与第j个字符相等的数出现

代码:(知识加了一个判断条件)

/*无重复字符情况的全排列问题*/

#include
#include
#include
using namespacestd;
char str[1000];
int isSwap(intfrom,int to)
{
       bool flag=true;
       for(int i=from;id后就输出
       {
              for(int i=0;i<=to;i++)
              {
                     cout<>str;
              sort(str,str+strlen(str));
           intsize=strlen(str);//获得字符串长度
              permitation(0,size-1);
       }
       return 0;
}


3、  知道原理之后下次用的时候可以直接利用STL中的库函数来做,库函数不用考虑是否有重复字符出现特别方便

代码:

 

#include
#include
#include
using namespacestd;
char str[1000];
int main(){
      
       while(1)
       {
              printf("Please input astring:");
              cin>>str;
              sort(str,str+strlen(str));
              //从stl库中调用全排列的库函数
              do
              {
                     for(inti=0;i


你可能感兴趣的:(#,数论,ACM)