字符串全排列的递归实现

#include "stdafx.h"
#include <iostream>
#include <assert.h>
using namespace std;

void permutation(char *pStr, char* pBegin)
{
    assert(pStr&&pBegin);
    if (*pBegin == ‘\0‘)
        cout << pStr << endl;
    else
    {
        for (char* pCh = pBegin; *pCh != ‘\0‘; ++pCh)
        {
            swap(*pBegin, *pCh);
            permutation(pStr, pBegin + 1);
            swap(*pBegin, *pCh);
        }
    }
}

int main()
{
    char str[] = "abcd";
    permutation(str, str);
}
  1. 这是在源字符串上的操作,因此,swap之后还需要再次swap回来以恢复。
  2. 最终结果是分组的
    • a开头,后面跟三个字符
    • b开头,后面跟三个字符
    • c开头,后面跟三个字符
    • d开头,后面跟三个字符

      先将一个字符a和后面的一个字符交换后,只需要再对后三个字符递归调用当前函数即可

  3. 递归的推出条件就是字符串为空*pBegin == ‘\0‘
时间: 2024-10-03 14:31:55

字符串全排列的递归实现的相关文章

字符串全排列和组合算法

打印字符串的全排列 算法的思路: 把一个字符串分成两部分,第一个字符+后面部分所有的字符.这样就能够递归的求解整个过程了: 1.每个字符都做一次首字符 2.当某个字符作为首字符的时候,求后面所有字符的全排列 而这里的求后面所有字符的全排列可以看成递归的子问题 全排列的递归树: 但是这里还有一个问题,那就是字符串中有重复的字符时,这样的算法会增加最后的结果数目.比如说字符串aab,a+ab的全排列,然后交换还是a+ab的全排列.所以会增加结果的数目.解决方案就是:当遇到重复的字符的时候就跳过去,不

从全排列看递归

1.什么是递归 1)举个生活中的例子:假设有一项很繁重的工作,我们总能把它划分为:总工作量=今天的工作+剩下的工作,只要我们每天都在坚持,一点点继续,那么剩下的工作会越来越少,总有一天,我们可以实现我们的梦想!(程序员的自我安慰~) 2)数学上来看: 例如:n的阶乘 f(n) = n!,n为整数 f(n) = 1   n<= 1                       (1) n*f(n-1) n >1                  (2) 有一个基础部分:它包含一个或多个值,对这些值

n个整数全排列的递归实现(C++)

全排列是非常常用的一个小算法,下面是n个整数全排列的递归实现,使用的是C++ #include <iostream> using namespace std; int n = 0; void swap(char *a ,char *b) { int m ; m = *a; *a = *b; *b = m; } void perm(char list[],int k, int m ) { int i; if(k >m) { for(i = 0 ; i <= m ; i++) { co

字符串全排列 java实现

经常会遇到字符串全排列的问题.例如:输入为{'a','b','c'},则其全排列组合为abc,acb,bac,bca,cba,cab.对于输入长度为n的字符串数组,全排列组合为n!种. package Bayes; public class RecursionTree { public static void permutation(char[] s,int from,int to) { if(to<=1) { return; } if(from ==to) { System.out.print

C++ 全排列问题——递归枚举法

全排列问题是一道非常经典的递归题目,而递归枚举法求解也是最暴力的一种方法. 例题 洛谷1706 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入格式 一个整数n. 输出格式 由1-n组成的所有不重复的数字序列,每行一个序列. 每个数字保留 5个场宽. 输入样例 3 输出样例 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 全排列问题--递归枚举法 这是一道经典的递归的题,每次递归枚举第x个数字是几,就是从1到

C++ 全排列问题——递归交换法

对于求解全排列问题有最暴力的递归枚举法,但是我们希望可以优化时间,因此出现了递归交换法. 例题 洛谷1706 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入格式 一个整数n. 输出格式 由1-n组成的所有不重复的数字序列,每行一个序列. 每个数字保留 5个场宽. 输入样例 3 输出样例 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 全排列问题--递归交换法 其实跟暴力枚举思路差不多,每次递归枚举第x个数字

PHP字符串全排列算法

<?php /** * PHP字符串全排列算法 */ $results = []; $arr = []; function bfs($start) { global $arr; global $results; $queue = []; array_push($queue, $start); while( !empty($queue) ) { $cur = array_shift($queue); if(strlen($cur) === count($arr)) { array_push($re

递归写出字符串全排列

给出一个字符串,例如“abc”,输出它的全排列及“abc”,"acb","bac","bca","cab","cba". 递归的方法: 核心思想:交换. 全排列(“abc”)=a.全排列(“bc”)+b.全排列("ac")+c.全排列(“ab”),其中a.全排列(“bc”)=ab.全排列(“c”)+ac.全排列(“b”)=abc+acb void swap(char *p, char *

全排列 (递归求解+字典序) java 转载

问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"."52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数大的最小数(这个数必然存在),0.2都不行,5可以,将5和2交换得到"956