题目:输入一个字符串,打印出该字符串中字符的所有排列。
例如输入字符串abc,则输出由字符a, b, c 所能排列出来的所有字符串
abc, acb, bac, bac, cab和cab。
分析:
这题主要考递归思想。
依次取出每个字符,剩下的字符的字符串所有排列都打印出来,再加上开始的字符。
实现:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>
#include <algorithm>
using namespace std;
vector<string> printallres(string instr)
{
vector<string> vecres;
vecres.clear();
int len = instr.length();
if(len == 1)
{
vecres.push_back(instr);
return vecres;
}
if( len <= 0)
return vecres;
vector<char> _tvecdata;
_tvecdata.clear();
for(int i = 0; i < len; i++)
{
vector<char>::iterator it = find(_tvecdata.begin(),_tvecdata.end(), instr[i]);
if(it != _tvecdata.end()) continue;
_tvecdata.push_back(instr[i]);
string tstr(1, instr[i]);
int j;
string str1 = "";
if(i > 0)
str1 = instr.substr(0, i);
string str2 = instr.substr(i+1, len - i -1);
str1 += str2;
vector<string> vecares = printallres(str1);
int k = 0;
while( k < vecares.size())
{
string str3 = tstr + vecares[k];
vecres.push_back(str3);
k ++;
}
}
return vecres;
}
int main(int argc, char* argv[])
{
if(argc >= 2)
{
vector<string> vecstr = printallres(argv[1]);
for(int i = 0; i < vecstr.size(); i ++)
cout << vecstr[i].c_str() << ",";
}
return 0;
}
编译:
g++ test.cpp -o test
运行:
./test abc
输出:
abc,acb,bac,bca,cab,cba,
增加测试用例(@abamon 朋友的提出的漏洞,修改,并增加的用例):
./test aab
输出:
aab,aba,baa,