字符串的全排列

《程序员面试攻略(第二版)》中第七章的一道题目。题目是这样子的:

实现一个例程,打印出一个字符串字符的所有可能顺序,即,打印这个字符串中所有字符的全排列。将输入字符串中每个字符作为一个独立的字符,即使它们发生重复。对于字符串”aaa”,您的例程应该打印出6个”aaa”。

递归思想可以解决。其算法的主要思路如下:

如果超过了最后一个位置
        打印这个字符串
        返回
否则
       对于输入字符串中的每一个字符
       如果它标记为已用过,跳过它,转向下一个字符
       否则
               将这个字符放在当前位置
               将这个字符标记为已用过
               从当前位置+1开始全排列余下的字符
               将这个字符标记为末用过
               从字符串中去除该字符

源程序

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

void permute(string str);
void doPermute(const string &in, string &out, bool *isUsed, int len, int level);

int main()
{
    permute("abc");

    return 0;
}

/*封装函数。
 *分配一个bool型数组作为字符是否已使用的标记;
 *分配一个string型变量作存放输出字符串。
 */
void permute(string str) {
    int len = str.size();
    bool *isUsed = new bool[len];
    for(int i = 0; i < len; i++)
        isUsed[i] = false;

    string out;
    string in = str;

    doPermute(in, out, isUsed, len, 0); //调用递归部分

    delete isUsed;
}

/*递归函数。
 */
void doPermute(const string &in, string &out, bool *isUsed, int len, int level) {
    if(level == len) {
        cout << out << endl;
        return ;
    }

    for(int i = 0; i < len; ++i) {
        if(isUsed[i])
            continue;

        out.push_back(in[i]);
        isUsed[i] = true;

        doPermute(in, out, isUsed, len, level + 1);

        isUsed[i] = false;
        out.erase(out.size() - 1, 1); //去除已加上的这个字符,为接下来的继续递归做好准备
    }
}

运行结果如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值