字符串的排列

2021-11-20  本文已影响0人  gaookey

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

我们求整个字符串的排列,可以看成两步。第一步求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。第二步固定第一个字符,求后面所有字符的排列。这时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的宇符交换。

// 指针 pStr 指向整个字符串的第一个字符,pBegin 指向当前我们执行排列操作的字符串的第一个字符。
void Permutation(char* pStr, char* pBegin)
{
    if(*pBegin == '\0')
    {
        printf("%s\n", pStr);
    }
    else
    {
        // 在每一次递归的时候,我们从 pBegin 向后扫描每一个字符(指针 pCh 指向的字符)。在交换 pBegin 和 pCh 指向的字符之后,我们再对 pBegin 后面的字符串递归地进行排列操作,直至 pBegin 指向字符串的末尾。
        for(char* pCh = pBegin; *pCh != '\0'; ++ pCh)
        {
            char temp = *pCh;
            *pCh = *pBegin;
            *pBegin = temp;

            Permutation(pStr, pBegin + 1);

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

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

    Permutation(pStr, pStr);
}

摘抄资料:《剑指offer》

上一篇 下一篇

猜你喜欢

热点阅读