枚举之求所有非连续子序列

2020.04.04举国哀悼所有在抗疫期间逝去的生命!


这个题目纯粹是在学习“动态规划之求最大公共子序列”我自己想的。求两个字符串的最大公共子序列,有一种比较笨的方法就是把其中一个字符串的子串求出来,看另一个字符串中是否包含的同时,记录这个子串的长度,最长那个便是。复杂的动态规划下篇再说,这篇先说如何求所有非连续的子串。

该题目等同于求一个数组中的所有子集,假如数组长度为3,则可以看作3个二进制位中1的个数:

000、001、010、100、110、101、011、111

真的佩服数学这个东西,可以把本质相同的一些问题进行转换。

上代码:

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

int main()
{
	int MaxLen[100];
	string str1,str2;
	cin>>str1;//>>str2;
	int i=0,j=0;//,len=str1.length()>str2.length()?str2.length():str1.length();
	//枚举,n个元素,所有子集个数=2的n次方,时间复杂度2的n次方,指数级
	int itotal=1<<str1.length();
	for(i=0;i<itotal;i++)
	{
		for(j=0;j<str1.length();j++)
		{
			if((1<<j&i)!=0)//这个也是数学的精髓
			{
				cout<<str1[j];
			}
		}
		cout<<endl;
	}
	//cout<<MaxLen[len-1]<<endl;
	return 0;
}

输出结果:

同时也想到了,如果题目改成所有的连续子序列呢,上代码:

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

int main()
{
	int MaxLen[100];
	string str1,str2;
	cin>>str1;//>>str2;
	int i=0,j=0,len=str1.length()>str2.length()?str2.length():str1.length();
	//枚举
	for(i=0;i<str1.length();i++)
	{
		for(j=i+1;j<str1.length()+1;j++)
		{
			cout<<str1.substr(i,j-i)<<endl;
		}
	}
	//cout<<MaxLen[len-1]<<endl;
	return 0;
}

输出结果:

扫描二维码关注公众号,回复: 10477619 查看本文章

发布了202 篇原创文章 · 获赞 18 · 访问量 74万+

猜你喜欢

转载自blog.csdn.net/nanfeiyannan/article/details/105312392