字符串的全排列

//问题:给定字符串S,生成该字符串的全排列。
//方法1:依次从字符串中取出一个字符作为最终排列
//的第一个字符,对剩余字符组成的字符串生成全排列,
//最终结果为取出的字符和剩余子串全排列的组合。
//?
#include <iostream>
#include <string>
using namespace std;
 
void permute1(string prefix, string str)
{
    if(str.length() == 0)
        cout << prefix << endl;
    else
    {
        for(int i = 0; i < str.length(); i++)
            permute1(prefix+str[i], str.substr(0,i)+str.substr(i+1,str.length()));
    }
}
 
void permute1(string s)
{
    permute1("",s);
}

void permute_my(char* strleft,char* strright);

int main()
{
    //method1, unable to remove duplicate permutations.
    cout << "method1" << endl;
	string str("ABC");
	cout<<str.length()<< endl;
    //permute1("ABA");
	permute1("",str);
	/////////////////////
	printf("================\n");
	permute_my("","ABC");
	return 0;
}
//优点:该方法易于理解,但无法移除重复的排列,
//如:s="ABA",会生成两个“AAB”。

void swap(char& a,char& b)
{
	char tmp=a;
	a=b;
	b=tmp;
}

void permute_my(char* strleft,char* strright)
{
	int leftlen=strlen(strleft);
	int rightlen=strlen(strright);

	if(rightlen==0)
         cout <<strleft<< endl;
	else
	{
	    char buff[256];
		//strcpy(buff,strleft);
		for(int m=0;m<leftlen;m++)
				 buff[m]=strleft[m];

		for(int i = 0; i < rightlen; i++)
			//permute1(prefix+str[i], str.substr(0,i)+str.substr(i+1,str.length()));
		{
			buff[leftlen]=strright[i];
			buff[leftlen+1]='\0';
			char buff_right[256];
			
			for(int j=0,k=0;j<rightlen;j++)
			{
				if(j==i)continue;
				buff_right[k++]=strright[j];
			}
			buff_right[k]='\0';
			permute_my(buff,buff_right);
		}

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值