暴力穷举法-输出最长公子串(1+2+……+n个)

代码骑士
优质创作者: 游戏开发技术领域
2023-01-16 20:41:20

最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence, LCS)的区别:子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列;更简略地说,前者(子串)的字符的位置必须连续,后者(子序列LCS)则不必。

#include<iostream>
#include<string.h>
#define N 10000
using namespace std;
 
//将全部子序列转化成字符串并存储在字符串数组中 
void strSubsequence(int *strlen,int n,char c[],string strs[]){
	string str;
	int slen=0,si=0;
	for(int h=0;h<n;h++){//子序列首
		for(int r=h;r<n;r++){//子序列尾 
			for(int i=h;i<r+1;i++){//输出子序列
				str+=c[i];
			} 
			//cout<<str<<endl;
			strs[si++]=str;
			slen++;
			str="";//清空上一个子串 
		} 
	}
	for(int i=0;i<slen;i++){
	//	cout<<strs[i]<<",";
	}
	*strlen=slen;
}
 
int main(){
	int n=0;
	cout<<"输入序列1的个数:";
	cin>>n; 
	char *c = new char[n]; 
	cout<<"输入序列1元素:";
	for(int i=0;i<n;i++){
		cin>>c[i];
	} 
	
	string strs[N];
	int strlen=0;
	strSubsequence(&strlen,n,c,strs);
	
	//输入序列2 
	int n2=0;
	cout<<"输入序列2的个数:";
	cin>>n2; 
	char *cc = new char[n2]; 
	cout<<"输入序列2元素:";
	for(int i=0;i<n2;i++){
		cin>>cc[i];
	} 
	//比较 
	string str="",maxstr="";
	int maxlength=-10;
	for(int h=0;h<n2;h++){//子序列首
		for(int r=h;r<n2;r++){//子序列尾 
			for(int i=h;i<r+1;i++){//输出子序列
				str+=cc[i];
			} 
			//cout<<str<<endl;
			for(int si=0;si<strlen;si++){
				if(str==strs[si]){
					int templen =(strs[si]).length();
					if(templen>maxlength){
						maxlength=templen;
						string temps = str;	
						maxstr=temps;
					} 
					
					cout<<strs[si]<<" "<<"长度:"<<(strs[si]).length()<<endl; 
				}
			} 
			str="";//清空上一个子串 
		} 
	}
	cout<<"最长共有子序列:"<<maxstr<<"长度为:"<<maxlength;
	return 0;
} 

输出样例: 

 

 

...全文
275 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

5

社区成员

发帖
与我相关
我的任务
社区描述
考研408:数据结构、计算机组成原理、操作系统、计算机网络
学习方法考研面试 其他
社区管理员
  • 代码骑士
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧