一个简单的问题 -全排列

全排列一共分为两种情况,有重复元素和无重复元素,大一开始做的时候不会写,现在特意写一下这个问题的各种解法。

1.无重复元素,这种相对简单一些,用递归就可以了

  首先找到第一个字母,然后找到剩余的字母中的第一个字母,依次类推,很简单,代码如下:

//本来准备用dfs写,发现两个的复杂度是一样的,就没有必要了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

char str[10],ans[10];
int n;

void dfs(int cur)
{
   if(cur==n)
   {
      for(int i=0;i<n;i++)
         putchar(ans[i]);
      putchar(' ');
   }
   else
   {
      for(int i=0;i<n;i++)
      {
         bool ok=1;
         for(int j=0;j<cur;j++)
            if(ans[j]==str[i])
            {
               ok=0;
               break;
            }
         if(ok)
         {
            ans[cur]=str[i];
            dfs(cur+1);
         }
      }
   }
}

int main()
{
   while(~scanf("%s",str))
   {
      n=strlen(str);
      sort(str,str+n);
      dfs(0);
   }
   return 0;
}

2.现在介绍第二种,就是有重复元素的情况,例如abbc的排列

先介绍一种简单的方法,stl中提供了一个全排列的函数,下面介绍一下,

next_permutation是头文件algorithm中的一个函数,使用的时候必须引用这个头文件,下面是他的使用方法
next_permutation(str+s,str+e);str是一个字符数组,str+n,表示数组需要排列开始的地方,str+e表示数组排列结束的地方,他的含义是这个序列内的字符按照字典序的大小产生下一个序列,代码如下:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int main()
{
  char s[10],str[10];
  cin>>s;
  strcpy(str,s);
  int len=strlen(s);
  do{
      cout<<s<<endl;
  next_permutation(s,s+len);
  }while(strcmp(str,s));
  return 0;
}

原文地址:https://www.cnblogs.com/jihe/p/4766997.html