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 查看本文章