码迷,mamicode.com
首页 > 编程语言 > 详细

每天一道算法题(39)——含有重复字符的全排列

时间:2015-11-02 14:05:44      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:全排列   重复   

思路

(1)对于含有重复字符的全排列必须使用isSwap函数
(2)整体思路
     a,交换当前子字符串(i----n-1)字符与子字符串后面的每一个位置的字符(满足交换条件下)
     b,子字符串位置后移(i+1-----n)。递归处理子字符串
     c,将a中的交换复原。


代码

#include <iostream>  
#include"string"
using namespace std;
void swap(char& a,char& b){//交换
	char temp=a;
	a=b;
	b=temp;
}
//***************************判断是否交换**********************************************************//
//当前需要交换的位置为m, 被交换的字符位置为n ,则s[n]应该异于s[m]---s[n-1]之间的任意一个字符
bool isSwap(string s,int m,int n){
	for(int i=m;i<n;i++)
		if(s[i]==s[n])
			return false;
	return true;
}

//递归全排列
void permute(string s,int n){
	if(n+1==s.length()){
		cout<<s<<endl;
	    return;
	}
	permute(s,n+1);
	char temp;
	for(int i=n+1;i<s.length();i++){
		if(isSwap(s,n,i)){
			swap(s[n],s[i]);
			permute(s,n+1);
			swap(s[n],s[i]);
		}
	}
}
void main(){
	string s("12233");
	permute(s,0);
}





版权声明:本文为博主原创文章,转载请注明出处。任何基于商业利益的传播均需事先征得本人许可。

每天一道算法题(39)——含有重复字符的全排列

标签:全排列   重复   

原文地址:http://blog.csdn.net/qianhen123/article/details/49585153

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!