字符串全排列
来源:互联网 发布: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; }
- 字符串的全排列
- 字符串的全排列
- 字符串全排列问题
- 字符串全排列
- 字符串全排列问题
- 字符串全排列
- 求字符串全排列
- 求字符串全排列
- 字符串的全排列
- 字符串全排列代码
- 字符串全排列
- 字符串全排列
- 字符串全排列
- 字符串的全排列
- 字符串全排列
- 求字符串全排列
- 字符串全排列
- 字符串的全排列
- 模板类中重载<<和>>操作符
- 序列化与反序列化的简单示例
- Ubuntu12.04下的 Android 源码下载
- x&(-x) Lowbit(x)
- 局部二值模式(LBP)中间过程的可视化
- 字符串全排列
- 从Waze被收购看谷歌与苹果的地图领域之战
- 最短路
- [Android]事件响应
- 数据结构之顺序栈
- Android ANR 分析解决方法
- PHP程序员专用输入法皮肤
- 【热门主题】约会大作战win7主题
- HDU 3496 Watch The Movie【二维费用的0/1背包问题】