字符串的所有不重复组合

输出一个串的所有可能字符组合,例如输入“abcd“,输出a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,acd,bcd,abcd
输入串可能会有重复字符,例如输入”abcc“,输出a,b,c,ab,bc,ac,cc,abc,acc,bcc

请设计算法和写出代码或伪代码

c++代码如下:

/************************************************************************/
/*一个长度为 n 的串的所有可能字符串组合有2^n个,可用1-2^n逐个转换成对应 */
/*二进制串中1的组合而成。												*/
/************************************************************************/

#include <math.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

vector<string> vecStr;//保存得到的子串

bool contains(string str)   //判断vecStr中是否已经存在str,返回bool值
{
	if (vecStr.size() == 0) // size为0的情况
	{
		return false;
	}
	for (int i = 0; i < (int)vecStr.size(); i++)
	{
		if (str == vecStr[i])
		{
			return true;
		}
	}
	return false;
}
void progress(string str)     
{
	char flag[20];
	char temp[20];
	for (int i = 1; i < (1<<str.length()); i++)
	{  
		_itoa_s(i,flag,2);  //i转换成对应的二进制01串
		//将二进制串中的为1的位置对应的字符整合到一个string中,并加入vector中
		string s(flag);
		int j = 0;
		for (int i = 0; i < (int)s.length(); i++)  //从后向前遍历 二进制串
		{
			if(*(s.end()-1-i) == '1')
			{
				temp[j++] = str.at(str.length() - i - 1);
			}
		}
		temp[j] = '\0';
		string ss(temp);
		reverse(ss.begin(),ss.end());              //翻转
		if (!contains(ss))
		{
			vecStr.push_back(ss);
		}
	}
	sort(vecStr.begin(),vecStr.end());             //字典序排序,可不加入
	for (int i = 0; i < (int)vecStr.size(); i++)   //打印
	{
		cout<<vecStr[i]<<endl;
	}
}
int main(){
	string str;
	cin>>str;
	progress(str);
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值