所在的位置: C++ >> C++介绍 >> C字符串全排列题型

C字符串全排列题型

问题描述:

给你一个字符串,求出字符串的所有排列

例如:“abc”

输出:“abc”,“acb”,“bac”,“bca”,“cab”,“cba”

思路求解:

我们可以根据原字符串,进行交换即可

例如:我们的0位置与0位置交换,代表我们本次字符不交换

我们0和1位置交换,就形成了"bac"这个字符串

我们可以遍历每个字符,再把它与每个字符尝试进行交换

所以我们可以写出以下代码

不过这个代码是错误的

我们在递归回溯的过程中,通常需要恢复现场

因为我们在这一层进行交换了后,回溯到上一层函数的话,就是拿交换后的字符串进行排序了,答案最终就不正确

所以我们要在每次递归完成后,恢复现场

我们这个代码还可以进行一个去重优化

设置一个boolused[]的数组,记录操作的字符如果某个字符没有出现,才进行操作

完整代码如下

  vectorstringPrintAllPermutations(strings)

  {

    intindex=0;

    vectorstringans;

    _PrintAllPermutations(s,index,ans);

    returnans;

  }

  void_PrintAllPermutations(strings,intindex,vectorstringans)

  {

    if(index==s.size())

    {

      ans.push_back(s);

      return;

    }

    boolisUsed[]={0};

    for(inti=index;is.size();i++)

    {

      if(!isUsed[(int)s[i]])

      {

        isUsed[(int)s[i]]=true;

        Swap(s,index,i);

        _PrintAllPermutations(s,index+1,ans);

        Swap(s,index,i);

      }

    }

  }

  voidSwap(strings,intx,inty)

  {

    chartmp=s[x];

    s[x]=s[y];

    s[y]=tmp;

  }




转载请注明:http://www.aierlanlan.com/rzfs/2439.html

  • 上一篇文章:
  •   
  • 下一篇文章: