面试题28:字符串的排列

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

这是一个典型的递归问题,考虑如何将复杂问题分解成简单问题,最后通过递归解决。我们肯定有这样的经验,自己在写abc的全排列的时候,肯定会想首先确定第一个字符,然后考虑后面有什么排列,比如确定第一个字符为a,那么剩下的b和c有两种排列,分别是bc和cb,那么以a开头的字符串有abc,acb这两种排列。这就是我们下面程序所需要用到的解题思路。

  1. 将字符串排列分解为字符串的第一个字符以及其后的剩余字符。剩余字符串又可以按照前面的思路来解决,分解为第一个字符和剩余字符串。当最后只有一个字符的时候,程序就到达出口,这个时候输出字符串,就是其中的一个排列。
  2. 字符串abc,那么可能出现在第一个字符的可能性有三种,我们只需要每次交互第一个字符,然后计算剩余字符串的排列即可。采用递归思路解决问题。

代码实例:

View Code
#include<iostream>
#include<stdlib.h>
using namespace std;

//交换元素值
void Swap(char &a,char &b)
{
    char temp;
    temp=a;
    a=b;
    b=temp;
}

//全排列函数
void Permutation(char string[],int start,int end)
{
    if(start==end)
    {
        cout<<string<<endl;
    }
    else
    {
        for(int i=start;i<=end;i++)
        {
            Swap(string[i],string[start]);
            Permutation(string,start+1,end);
            Swap(string[i],string[start]);
        }
    }
}

void main()
{
    char string[]="abc";
    int len=strlen(string);
    Permutation(string,0,len-1);
    system("pause");
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值