字符串全排列问题(递归回溯)
2015-08-25 22:16
435 查看
ProblemA:无重复字符
输入一个字符串,打印出该字符串的所有排列,所有字符串不相同。SolutionA
问题拆解,将求排列问题看成两步:step1:求所有可能出现在第一个位置的字符,即把第一个字符与后面的字符依次交换依次。
step2:固定第一个字符,求后面所有字符的排列。此时,仍将问题分解成两部分:后面的第一个字符,以及这个字符后的所有字符。然后将第一个字符依次与后面的所有字符交换。指导最后一个字符处递归停止。
Source code
#include <iostream> using namespace std; void Perm(char *array, int pos, int last) { if (pos == last) { cout << array << endl; } else { for (int i = pos; i <= last; i++) { swap(array[i], array[pos]);//每次待排列的第一个字符与其后的每个字符交换 Perm(array, pos + 1, last);//递归求交换字符其后所有字符的排列 swap(array[i], array[pos]);//恢复字符串原有词序,为下一循环i++做准备,一定要交换回来!!! } } } int main(int argc, char* argv[]) { char * str = new char[100]; cin >> str; int i = 0; while (str[i++] != '\0'); i = i - 2; Perm(str, 0, i); return 0; }
Output
输入:abc输出:
abc
acb
bac
bca
cba
cab
Problem B:有重复字符
输入一个字符串,打印出该字符串的所有排列,同一字符可能出现多次。例输入:abb,打印:abb,bba,bab.Solution B
维护一个count数组,里面记录的是所含不同的字符,以及各个字符出现的次数。stack
数组用来记录当前生成的排列,depth表示修改stack[depth]的值。
source code
#include <stdio.h> #include <string.h> #include <memory.h> int m;//记录字符串长度 int n;//记录字符串中的字符种类数 char map[256];//记录是哪几种字符 int count[256];//记录每种字符有多少个 void Make_Map(char *str)//统计字符串的相关信息 { int s[256]; int i; memset(s, 0, sizeof(s)); memset(count, 0, sizeof(count)); m = strlen(str); while (*str) { s[*str]++; str++; } n = 0; for (i = 0; i<256; i++) if (s[i]) { map = i; count = s[i]; n++; } } int stack[1000];//递归用的栈,并记录当前生成的排列 void Find(int depth)//递归式回溯法生成全排列 { int k = 0; if (depth == m) { int i; for (i = 0; i<depth; i++) { putchar(map[stack[i]]); //printf("%d\n",k); } putchar('\n'); } else { int i; for (i = 0; i<n; i++) if (count[i]) { stack[depth] = i; count[i]--; Find(depth + 1); count[i]++; } } } void main() { char str[1000]; gets_s(str, 1000); Make_Map(str); Find(0); }
相关文章推荐
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- C#中的尾递归与Continuation详解
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- Javascript递归打印Document层次关系实例分析
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法
- 全排列算法的非递归实现与递归实现的方法(C++)
- php递归列出所有文件和目录的代码
- java递归菜单树转换成pojo对象
- 一个JavaScript递归实现反转数组字符串的实例
- Java中的递归详解(用递归实现99乘法表来讲解)
- C语言的递归思想实例分析
- php通过递归方式复制目录和子目录的方法
- php递归法读取目录及文件的方法
- php实现递归与无限分类的方法