字符串的全排列
来源:互联网 发布:网络探测器 编辑:程序博客网 时间:2024/04/29 22:16
《程序员面试攻略(第二版)》中第七章的一道题目。题目是这样子的:
实现一个例程,打印出一个字符串字符的所有可能顺序,即,打印这个字符串中所有字符的全排列。将输入字符串中每个字符作为一个独立的字符,即使它们发生重复。对于字符串”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); //去除已加上的这个字符,为接下来的继续递归做好准备 }}
运行结果如下:
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- df
- 程序员职业发展:项目经理、技术经理还是产品经理
- C# ServerVariables变量说明
- linux中建的socket的最大限制
- sql 2008的SSIS应用方法: 将多个一定格式的文本文件批量导入到数据库
- 字符串的全排列
- 值类型、引用类型
- 做一个时间的管理者
- Unix/Linux C++应用开发-Linux下用户管理
- Linux下使用Python的Tkinter库出现的No module named _tkinter问题
- cmnet和cmwap的区别
- Oracle树查询
- JDBC addbatch批量处理数据时有最大值限制
- http status 汇总