字符串全排列算法--去除重复的排列

一:问题描述:

输入一字符串,显示其非重复的全排列

二:设计思路:

递归实现,比如字符串abb,设计一个指针pBegin指向当前被操作的字符,定义一个新指针it从pBegin位置开始,与pBegin所指向字符交换

比如:输入abb

pBegin指向首字符a,it从pBgin位置开始与其所指向字符交换

三 :代码

/*
This is a free Program, You can modify or redistribute it under the terms of GNU
*Description:字符串全排列--去除重复的排列

*Language: C++
*Development Environment: VC6.0
*Author: Wangzhicheng
*E-mail: 2363702560@qq.com
*Date: 2012/12/12
*/

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

class Solution {
private:
	string str;
    /*
	检验pBegin到pEnd区间内有没有和*pEnd相同的字符
	*/
	bool IsSwap(string::iterator pBegin,string::iterator pEnd) {
		string::iterator it;
		for(it=pBegin;it!=pEnd;it++) {
			if(*it==*pEnd) return false;
		}
		return true;
	}
	/*
	递归实现全排列,要想除去重复的排列,关键在于理解递归的过程
	*/
	void FullArrange(string &str,string::iterator pBegin) {
		static int i;
		if(!(*pBegin)) {
			cout<<"第"<<++i<<"种全排列是:"<<str<<endl;
		}
		else {
			for(string::iterator it=pBegin;*it;it++) {
				if(!IsSwap(pBegin,it)) continue;
				swap(*pBegin,*it);
				FullArrange(str,pBegin+1);
				swap(*pBegin,*it);
			}
		}
	}
public:
	Solution(const string str) {
		this->str=str;
	}
	void FullArrange() {
		FullArrange(str,str.begin());
	}
};

void main() {
	Solution s("abb");
	s.FullArrange();
}


 

三:测试

输入abb

输出:

输入abcd

输出:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值