字符串的全排列

Posted drfxiaoliuzi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串的全排列相关的知识,希望对你有一定的参考价值。

题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc,acb, bac, bca, cab, cba。

C++版本

#include <iostream>
#include <string.h>
using namespace std;

template<typename T>
void swap_interview(T& a, T& b) {
    T temp;
    temp = a;
    a = b;
    b = temp;
}

char s[10] = { ‘0‘ };
void permutation(string ch, int begin, int end) {
    //cout << "begin:" << begin << " end:" << end << endl;
    if (begin + 1 == end) {
        /* 输出当前的排列 */
        for (int i = 0; i < end; i++)
        {
            //printf("%d ", ch[i]);
            cout << ch[i];
        }
        cout << endl;
    }
        
    else {
        int aa(0);
        for ( (aa = begin); aa < end; ++aa) {
            //cout << "aa:" << aa << endl;
            swap_interview(ch[begin], ch[aa]);
            //cout  << ch[begin] << " ";
            permutation(ch, begin + 1, end);
                        // 将改变过的字符串恢复为原始字符串,以便于下一次循环迭代是基于原始字符串开始的
            swap_interview(ch[begin], ch[aa]);
            
        }
    }
}

void f(int a) {
    for (int i = a; i < 5; ++i)
    {
        cout << "a:" << a << endl;
        cout << "i:" << i << endl;
    }
}


int main(void)
{
    string ch("abc");
    //ch[0] = ‘c‘;
    //return ch[0];
    cout << "ch size:" << ch.size() << endl;
    permutation(ch, 0, ch.size());
    //f(0);

    return 0;
}

自己写出的错误版本:

技术分享图片

教训:

DFS还需要练习,多写几遍

书中给出的C语言版本:

// StringPermutation.cpp : Defines the entry point for the console application.
//

// 《剑指Offer——名企面试官精讲典型编程题》代码
// 著作权所有者:何海涛

#include "stdafx.h"

void Permutation(char* pStr, char* pBegin);

void Permutation(char* pStr)
{
    if(pStr == NULL)
        return;

    Permutation(pStr, pStr);
}

void Permutation(char* pStr, char* pBegin)
{
    if(*pBegin == ‘‘)
    {
        printf("%s
", pStr);
    }
    else
    {
        for(char* pCh = pBegin; *pCh != ‘‘; ++ pCh)
        {
            char temp = *pCh;
            *pCh = *pBegin;
            *pBegin = temp;

            Permutation(pStr, pBegin + 1);

            temp = *pCh;
            *pCh = *pBegin;
            *pBegin = temp;
        }
    }
}

// ====================测试代码====================
void Test(char* pStr)
{
    if(pStr == NULL)
        printf("Test for NULL begins:
");
    else
        printf("Test for %s begins:
", pStr);

    Permutation(pStr);

    printf("
");
}

int _tmain(int argc, _TCHAR* argv[])
{
    Test(NULL);

    char string1[] = "";
    Test(string1);

    char string2[] = "a";
    Test(string2);

    char string3[] = "ab";
    Test(string3);

    char string4[] = "abc";
    Test(string4);

    return 0;
}

ref:
《剑指offer》何海涛
https://blog.csdn.net/u010889616/article/details/48165689



以上是关于字符串的全排列的主要内容,如果未能解决你的问题,请参考以下文章

递归 - 求数字/字符串的全排列

字符串的全排列

算法——全排列

算法习题---字符串的全排序列

js-FCC算法-No repeats please字符串的全排列

字符串的全排列