C++最长公共子串问题

240 阅读1分钟

方法1:暴力循环,算法复杂度nmm

方法2:使用矩阵(二维数组)存储状态,时间换空间, 算法复杂度mn,空间复杂度mn

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

//算法复杂度n*m*m
int maxchar(char *s,int m,char *t,int n){
	int i=0,j=0;
	int max=0,pos=0,cmax=0;//
	// char res[];
	while(i<n){
		while(j<m){
			cmax = 0;
			for(int k=j,l=i;k<m&&l<n&&t[l]==s[k];l++,k++,cmax++);	
			if(cmax>max)
				max = cmax,
				pos = i;
			j++;
		}
		j=0,i++;
	}
	cout<<"maxchar:"<<max<<endl;
	return max;
}

//矩阵存储是否相等的向量,空间换时间
//算法复杂度m*n
int matricmaxchar(char *s,int m,char *t,int n){
	int matrix[m][n];
	int max=0;
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			if(s[i]==t[j]){
				if(j >0 && i>0){
					matrix[i][j] = matrix[i-1][j-1]  + 1;
					matrix[i][j] > max ? max = matrix[i][j]:NULL;
				}else{
					matrix[i][j] = 1;
				}
			}else{
				matrix[i][j] = 0;
			}
		}
	}
	cout<<"matricmaxchar:"<<max<<endl;
	return max;
}



int main(){
	string s = "werasdfaswer";
	string t = "asdfas";
	int m = s.length();
	int n = t.length();
	char *s_str = (char *)s.c_str();
	char *t_str = (char *)t.c_str();
	maxchar(s_str,m,t_str,n);
	matricmaxchar(s_str,m,t_str,n);
};