您的位置:首页 > 其它

打印给定字符串中字符的所有排列

2014-08-19 11:49 239 查看
题目:

  输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。

解决:

  简单起见,字符串中没有相同的字符。

  其实这是个递归的过程:对于字符串str,先分别逮住其中的每一个,如s,把它从str中踢开,成了 s + tr(下一次踢开t变为 t + sr),然后对于剩下来的,再从剩下的再次分别踢开一个加到左边的后面(假想被踢开的都在左边,剩下的都在右边哈),一直如此,直至右边都踢光了。算法如下:  

void show(strL, strR)
{
if (strR不是空字符串)
{
for (对于strR中的每一个字符)
{
把这个字符踢到strL的后面
递归show()
}
}
else
{
显示左边的字符串
}
}


  代码如下:

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::cin;
using std::string;

//在这个过程中,把字符串分为左右两半,左边的字符已经固定,右边的可以组合出各种情况
//最后把左边固定的和右边各种情况一一连接,就是完整的各种字符串了
void show(string strL, string strR)
{
if (!strR.empty())        //右边的非空
{
for (int i = 0; i < strR.size(); i++)        //对于每种情况
{
//注意要用左右字符串的副本
string tempL = strL;
string tempR = strR;

tempL.append(1, strR[i]);        //把那个字符添加到左边字符串的后面
tempR.erase(i, 1);        //右边的字符串中删除那个
show(tempL, tempR);        //递归进行
}
}
else
{
cout << strL << endl;
}
}

int main(void)
{
string left;
string test("abcde");

show(left, test);
cout << "------------------------------------\n" << left << endl << test;

cin.get();
}


  结果:



总结:

  递归的思想。

  其实可以看做一棵树,从根节点开始分叉,每一个分叉是一种情况,最终到叶节点的高度为n,n为字符串长度,每个叶节点是一种情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐