《剑指offer》第三十八题(字符串的排列)

Posted cjt-blog

tags:

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

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

#include <iostream>

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

void Permutation(char* pStr)
{
    if (pStr == nullptr)
        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 == nullptr)
        printf("Test for nullptr begins:
");
    else
        printf("Test for %s begins:
", pStr);

    Permutation(pStr);

    printf("
");
}

int main(int argc, char* argv[])
{
    Test(nullptr);

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

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

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

    char string4[] = "abc";
    Test(string4);
    system("pause");
    return 0;
}

技术图片

技术图片

技术图片

技术图片

 

以上是关于《剑指offer》第三十八题(字符串的排列)的主要内容,如果未能解决你的问题,请参考以下文章

《剑指offer》第五十八题(左旋转字符串)

《剑指offer》第五十八题II:左旋转字符串

《剑指offer》第四十八题:最长不含重复字符的子字符串

剑指offer第十八题 顺时针打印矩阵

《剑指offer》第十八题:在O时间删除链表结点

leetcode 简单第三十八题 Excel表列名称