全组合—动态规划

#include<iostream>
#include<string>
#include<vector>
using namespace std;

vector<string> result;
int hashtable[26]={0};
bool flag=false;

int main()
{
	string a;
	cin>>a;
	int len=a.length();
	int i;
	for(i=0;i<len;i++)
	{
		int count=result.size();
		int k;
		int index=a[i]-'a';
		for(k=0;k<count;k++)
		{	
			if(hashtable[index]==0)
			{
				string temp=result[k]+a[i];
				result.push_back(temp);
			}
			else
			{
				string temp=result[k];
				int j;
				int count=0;
				for(j=0;j<temp.length();j++)
				{
					if(temp[j]==a[i])
						count++;
				}
				if(count==hashtable[index])
				{
					flag=true;
					string temp=result[k]+a[i];
					result.push_back(temp);
				}
			}
		}
		hashtable[index]++;
		if(!flag)
		{
			string b(1,a[i]);
			result.push_back(b);
			flag=false;
		}
	}
	vector<string>::iterator p= result.begin();
	for(p;p!=result.end();p++)
		cout<<*p<<endl;
	return 0;

}

全组合的意思: 比如输入三个字母 A , B, C。 则把它们可能的组合全部打印出来: A, B, C, AB, AC, BC, ABC。 

策略:

      使用动态规划。逐个字母地访问。用一个vector<string> 保存到目前为止可能的组合。比如对于A,B, C 输入序列。动态规划的结果是

1. A

2. A,   AB,  B

3. A,   AB,  B,  AC,  ABC,  BC, C

通过模拟,我们应该能发现,若输入序列为ABCC(即输入序列中含有相同的字母,则这种方法会答应出重复的组合)。采取的方法是:建立一个hash表,记录输入序列中每个单词出现的次数。比如对于第二个C,此时C出现的次数已经为1.则只需添加动态规划中含有C一次的那些组合。

1. A
2. A,   AB,  B
3. A,   AB,  B,  AC,  ABC,  BC, C

4. A,   AB,  B,  AC,  ABC,  BC, C, ACC, ABCC, BCC, CC

参考代码:



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值