字符串全排列的递归和非递归实现
2013-10-01 23:11
190 查看
/* 全排列实现的两种方式 (1) 递归实现 可由每个数与第一个数交换实现之,交换之后对后面的数也进行全排列,这是一个递归的过程 如 1,2,3 的全排列过程如下 1,2,3 1,3,2 第一位与第一位交换,然后对2, 3 求全排列 2,1,3 2,3,1 第二位与第一位交换,然后对1,3 求全排列 3,1,2 3,2,1 第三位与第一位交换,然后对1,2 求全排列 这种情况下可能出现重复的情形,如122, 我们可以用第一个数与后面不重复的数字交换来达到去除重复的目的,当然也可以使用非递归来实现达到不重复的目的 (2)非递归的情况 首先,从字符串后面往前找,找到一个后面数大于前面的数的数 如 12348765,第一次应该是找到4 然后从后往前找第一个大于4 的数,两个数字交换之,然后把4后面的数字倒置过来即可,这样就找到了大于次 字符串的第一个数,然后依次循环下去就可遍历所有的排列情况 当然如果要找一个字符串的全排列,必须对其排序,否则只能找到所有比他大的数 */ #include<iostream> using namespace std; //递归实现之 void swap(char &a, char &b) { char temp = a; a = b; b = temp; } bool ifswap(char *p, int begin, int end) { for(int i=begin; i<end; ++i) { if(p[i] == p[end]) return false; } return true; } void AllArray(char *p, int offset, int len) { if(len == (offset+1)) cout<<p<<endl; else { for(int i=offset; i<len; ++i) { if(ifswap(p, offset,i)) { swap(p[offset], p[i]); AllArray(p, offset+1, len); swap(p[offset], p[i]); } } } } bool iflast(char *p) { for(int i=0; i<int(strlen(p)-1); i++) { if(*(p+i)<*(p+i+1)) return false; } return true; } void reverse(char *p) { int len=0, i=0; char *temp = p; while(*(++temp)!='\0') len++; while(i<len) swap(p[i++],p[len--]); } //非递归实现之 void No_rec_AllArray(char *p, int len) { cout <<p<<endl; while(!iflast(p)) { int pos1, pos2; for(int i=len-1;i>0; --i) { if(*(p+i)>*(p+i-1)) { pos1 = i-1; break; } } for(int i=len-1; i>pos1; --i) { if(*(p+i)>*(p+pos1)) { pos2 = i; break; } } swap(p[pos1], p[pos2]); reverse(p+pos1+1); cout << p <<endl; } } int main() { char p[] ="1224"; cout <<"递归实现:"<<endl; AllArray(p, 0, strlen(p)); cout <<endl; cout <<"非递归实现:"<<endl; No_rec_AllArray(p, strlen(p)); return 0; }
相关文章推荐
- 算法题/用递归实现一个字符串的全排列
- 《Java数据结构与算法》笔记-CH6-递归-1递归实现全排列字符串
- 字符串的全排列_递归实现
- 求字符串编辑距离的递推和递归实现
- 我的公共子字符串查找方法,非递归实现或者可以说没有实现递归
- C语言用回溯算法实现求字符串的全排列
- [算法] 字符串的全排列 [dfs - 递归神技]
- 字符串的组合问题 递归和非递归实现
- Java 递归实现全排列
- 字符串的逆序递归实现 C语言实现
- 递归实现集合全排列
- 用递归的方法实现全排列
- 递归实现全排列(一)
- C++常考的上机题型:判断一个字符串是否为回文串(递归实现)
- 算法设计与分析 全排列的递归实现算法
- 编写一个函数reverse_string(char * string)(递归实现),反向排列字符串
- 递归实现元素全排列
- 一个小学奥数题的python实现(全排列,字符串循环移位,统计元素)
- 字符串逆序(递归实现)
- 求字符串长度之递归与非递归的C语言实现