字符串全排列

来源:互联网 发布:js捷豹f-pace试驾视频 编辑:程序博客网 时间:2024/05/21 17:41

如果没有重复字符:

#include <iostream>using namespace std;void swap(char*,char*);void permutation(char*,char*);int main(){   char a[] = "abcd";   permutation(a,a);   cin.get();}void swap(char* a,char *b){  char temp=*a;*a=*b;*b=temp;     }// str 整个串// pBegin 后面的字符串拉到前面的起始位置 void permutation(char* str,char* pBegin){  if(*pBegin=='\0')    cout<<str<<endl;  else  {    for(char* p=pBegin;*p!='\0';p++)    {       一/*          前面当稳定段,从第一个开始将后面的字符换上来,          然后将该位置之后再全排列,自身和自身互换正好递归到底           打印出字符串        */       swap(p,pBegin);       permutation(str,pBegin+1);       swap(p,pBegin);             }      }     }

如果有重复字符


// shortest sequence containing ABCD   #include <memory>#include <iostream>using namespace std;void swap(char*,char*);bool isSwap(char*,char*);void permutation(char*,char*);int main(){   char a[] = "122";   permutation(a,a);   cin.get();}void swap(char* a,char *b){  char temp=*a;*a=*b;*b=temp;     }/*  有重复的话,去重时:  自身和自身还是要可以互换的才能往下递归打印  自身开始到互换位置如果互换位置的字符出现过,则不用互换    */bool isSwap(char* pBegin,char* end){   while(pBegin<end) //自身和自身互换则条件直接不满足    {      if(*pBegin==*end)        return false;       pBegin++;                }   return true;  }// str 整个串// pBegin 后面的字符串拉到前面的起始位置 void permutation(char* str,char* pBegin){  if(*pBegin=='\0')    cout<<str<<endl;  else  {    for(char* p=pBegin;*p!='\0';p++)    {       /*          前面当稳定段,从第一个开始将后面的字符换上来,          然后将该位置之后再全排列,自身和自身互换正好递归到底           打印出字符串        */       if(isSwap(pBegin,p))       {          swap(p,pBegin);          permutation(str,pBegin+1);          swap(p,pBegin);                                            }                    }      }     }

/*   全排列变体   用122345这六个数字全排列,    4不能在第三位,35不相连 */#include <iostream>using namespace std;bool isSwap(int[],int begin,int end,int n);void swap(int&,int&);void permutation(int[],int begin,int n);int count = 0;int main(){   int a[] = {1,2,2,3,4,5};   permutation(a,0,sizeof(a)/sizeof(int));   cout<<::count;   cin.get(); }void swap(int& a,int& b){int temp=a;a=b;b=temp;}void permutation(int a[],int begin,int n){   if(begin==n)   {      for(int i=0;i<n-1;i++) // 35在一起就返回         if(a[i]+a[i+1]==8)          return;      for(int i=0;i<n;i++)       cout<<a[i]<<" ";      cout<<endl;      ::count++;      return;            }   for(int i=begin;i<n;i++)   {      if(isSwap(a,begin,i,n))      {         swap(a[i],a[begin]);         permutation(a,begin+1,n);         swap(a[i],a[begin]);               }         }  }bool isSwap(int a[],int begin,int end,int n){   if(begin==2&&a[end]==4)     return false;   if(a[begin]==4&&end==2)     return false;   for(int i=begin;i<end;i++)     if(a[i]==a[end])       return false;   return true;                   }