­

手写字符串的全排列

  • 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;  }