手寫字元串的全排列
- 2019 年 10 月 16 日
- 筆記
題目描述如下:
當輸入一個字元串時,輸出一個字元串的全排列,例如輸入,abc,
輸出如下:
解決思想時
使用dfs,當保存的目的字元串達到排列字元串最終的長度時,這時需要,把這個字元串保存下來,
然後當前遞歸結束,遞歸返回時,在字元串中之前 加入的最後一個字元需要刪除掉,然後再返回其他字元串
源程式如下
#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; }