字符串的全排列

题目:

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

思路:

从字符串中选出一个字符为排头然后对后面字符做全排列。

步骤:

将a固定在第一位,求后面bc的排列

将b固定在第一位,求后面ac的排列

将c固定在第一位,求后面ab的排列

代码如下:

#include <iostream>
#include <string>
using namespace std;
 
void paixu(string prefix, string str)
{
    if(str.length() == 0)
        cout << prefix << endl;
    else
    {
        for(int i = 0; i < str.length(); i++)
            paixu(prefix+str[i], str.substr(0,i)+str.substr(i+1,str.length()));
    }
}
 
void paixu(string s)
{
    paixu("",s);
}
 
int main()
{

    paixu("abc");
    
}


运行结果:

abc
acb
bac
bca
cba
cab


该方法易于理解,但无法移除重复的排列,如:s="ABA",会生成两个“AAB”。

方法二:

思路:用下面的图片来描述再直观不过了


代码如下:


#include<stdio.h>
void allPermutation(char * perm ,int from ,int to);
void swap(char *perm ,int from ,int to);

main(){
	
	char a[]={"aba"};
	allPermutation(a ,0 ,2);	
}

void allPermutation(char * perm ,int from ,int to){
	if(to <= 1){
		return;
	}
	if(from == to){
	
		for(int i=0 ;i<=to ;i++){
			printf("%c",perm[i]);
			
		}
		printf("\n");
	}else{
		for(int j= from ;j<=to ;j++){
			
			if(perm[from] == perm[j] && j != from){
				continue ;
			}
			swap(perm ,j,from);			
			allPermutation(perm ,from +1 ,to);			
			swap(perm,j,from);
			
		}
	}
}
void swap(char *perm ,int from ,int to){

	char temp =0;
	temp = perm[from];
	perm[from] =perm[to];
	perm[to] =temp;

}


运行结果:

aba
aab
baa


下面语句用来去除重复情况:

if(perm[from] == perm[j] && j != from){
				continue ;
			}

该方法理解起来并不是那么直观,可以试着一步一步跟踪观察值的变化。





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值