手写字符串的全排列
题目描述如下:
当输入一个字符串时,输出一个字符串的全排列,例如输入,abc,
输出如下:
解决主要思想
使用dfs,当保存的目的字符串达到排列字符串最终的长度时,这时需要,把这个字符串保存下来,
然后当前递归结束,递归返回时,在字符串中之前 加入的最后一个字符需要删除掉,然后再返回其他字符串,
为了防止,重复访问,每次访问后的字符,需要设置访问的flag,
源程序如下
#include<iostream>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<set>
using namespace std;
void dfs(set < string > &res, const string & src, string & dst, int *flags,
int dstLen);
vector < string > Permutation(string str)
{
if (str.empty()) {
vector < string > res;
return res;
}
// int flags[10];
int *flags = new int[str.size()];
set < string > strSet;
for (int i = 0; i < str.size(); i++) {
string s;
memset(flags, 0, sizeof(sizeof(int) * str.size()));
s.push_back(str[i]);
flags[i] = 1;
dfs(strSet, str, s, flags, str.size());
}
vector < string > res(strSet.begin(), strSet.end());
delete[]flags;
return res;
}
void dfs(set < string > &res, const string & src, string & dst, int *flags,
int dstLen)
{
if (dst.size() == dstLen) {
res.insert(dst);
return;
}
for (int i = 0; i < src.size(); i++) {
if (!flags[i]) {
flags[i] = 1;
dst.push_back(src[i]);
dfs(res, src, dst, flags, dstLen);
dst.pop_back();
flags[i] = 0;
}
}
}
void testPermutation()
{
string s("abc");
vector < string > res;
res = Permutation(s);
for (int i = 0; i < res.size(); i++) {
cout << res[i] << " " << endl;
}
}
int main()
{
testPermutation();
return 0;
}
作者: 盛夏落木
出处: https://www.cnblogs.com/wanshuafe/
关于作者:专注云存储,文件系统领域,请多多赐教!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(wanshuafe@163.com)咨询.