手写字符串的全排列

题目描述如下:

当输入一个字符串时,输出一个字符串的全排列,例如输入,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;
}

posted on 2019-10-16 23:20  盛夏落木  阅读(304)  评论(0编辑  收藏  举报

导航