53.字符串的排列

 题目:输入一个字符串,打印出该字符串中字符的所有排列。
例如输入字符串abc,则输出由字符a、b、c 所能排列出来的所有字符串
abc、acb、bac、bca、cab 和cba。
分析:这是一道很好的考查对递归理解的编程题,
因此在过去一年中频繁出现在各大公司的面试、笔试题中。

我们以三个字符abc 为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求
后面两个字符bc 的排列。当两个字符bc 的排列求好之后,我们把第一个字符a 和后面的b
交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac 的排列。现在是把c 放到
第一位置的时候了。记住前面我们已经把原先的第一个字符a 和后面的b 做了交换,为了保
证这次c 仍然是和原先处在第一位置的a 交换,我们在拿c 和第一个字符交换之前,先要把
b 和a 交换回来。在交换b 和a 之后,再拿c 和处在第一位置的a 进行交换,得到cba。我
们再次固定第一个字符c,求后面两个字符b、a 的排列。

 

代码:

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


int count=0;//统计排列数目,用数学验证是否正确
void Permutation(char a[], int start, int end)
{
    int i,j;
    char temp;
    if(start == end)
    {
        for(i = 0; i <= end; i++)
            cout<<a[i];     
		count++;
		cout<<endl;
    }
    else
    {
        for(i = start; i <= end; i++)//每次轮循一个字符,然后将此字符放到第一个位置,再对后面的字符排列(递归)
        {
            for(j=start;j<i;j++)//防止字符重复的情况,前面有与此字符重复的字符,结束将此字符放到第一个位置再排列
                if(a[j]==a[i]) 
					goto nextI;

            temp=a[start]; a[start]=a[i]; a[i]=temp;//将轮循到的字符放到第一个位置
            Permutation(a, start+1, end);           //再对后面的字符排列(递归)
            temp=a[start]; a[start]=a[i]; a[i]=temp;//再将首字符交换回来
       nextI:;

		}
    }
}

int main()
{
    char A[] = "aaaaa";
	char B[] = "abccd";
    Permutation(A,0,4);
	cout<<count<<endl;
	cout<<"--------------"<<endl;
	Permutation(B,0,4);
	cout<<count<<endl;
    
    return 0;
}


 

你可能感兴趣的:(编程,c,面试,permutation)