欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【华为OJ平台练习题】求最大公共子串的个数和元素

程序员文章站 2022-03-09 15:11:37
...

1.原题是求出最大公共子串的个数就可以

原理:利用二维矩阵排列的方式。将俩字符串进行比較

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

int  prcs_2Strs(const char* s1,const char* s2)
{
	int maxSameLength = 0;
	int L1 = strlen(s1);
	int L2 = strlen(s2);
	if(L1==0 || L2==0)	//推断字符串是否为空?
		return 0;

	int **c = new int*[L1+1];  //创建矩阵,保存S1与S2各元素比較的结果
    for(int i = 0; i < L1+1; i++)  
        c[i] = new int[L2+1];  
    for(int i = 0; i < L1+1; i++)  //矩阵初始化为0          
	{
		for(int j = 0; j < L2+1; j++)  
		{	c[i][j]=0;     }
	}
	for(int m =0;m<L1;m++)
	{
		for(int n=0;n<L2;n++)
		{
			if(s1[m]==s2[n])	//開始比較
			{
				//统计比較结果在矩阵 C 中
				if((m==0||n==0))	//第一行或者第一列,C[m][n]没有左上角元素,则把它自己置为1
					c[m][n]=1;
				else
					c[m][n]=c[m-1][n-1]+1;	//在左上角元素基础上加上1
			}
		}
	}
	for(int i = 0; i < L1+1; i++)  //找出最大值,赋给maxSameLength          
	{
		for(int j = 0; j < L2+1; j++)  
		{	
			if(c[i][j]>maxSameLength)
				maxSameLength = c[i][j];
		}
	}
	return maxSameLength;
}

int main()
{
	char s1[30],s2[30];
	cout<<"输入俩字符串:";
	cin.getline(s1,30);
	cin.getline(s2,30);
	cout<<"最大公共子串元素数量为:"<<prcs_2Strs(s1,s2)<<endl;
	return 0;
}

【华为OJ平台练习题】求最大公共子串的个数和元素

2. 统计个数并输出元素

我的思路是将个数和位置存入到一个Vector中。然后输出

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

vector<int>  prcs_2Strs(const char* s1,const char* s2)
{
	vector<int> pos;
	int maxSameLength = 0;
	int L1 = strlen(s1);
	int L2 = strlen(s2);
	if(L1==0 || L2==0)	//推断字符串是否为空
		return pos;

	int **c = new int*[L1+1];  //创建矩阵,保存S1与S2各元素比較的结果
    for(int i = 0; i < L1+1; i++)  
        c[i] = new int[L2+1];  
    for(int i = 0; i < L1+1; i++)  //矩阵初始化为0          
	{
		for(int j = 0; j < L2+1; j++)  
		{	c[i][j]=0;     }
	}
	
	for(int m =0;m<L1;m++)
	{
		for(int n=0;n<L2;n++)
		{
			if(s1[m]==s2[n])	//開始比較
			{
				//统计比較结果在矩阵 C 中
				if((m==0||n==0))	//第一行或者第一列,C[m][n]没有左上角元素,则把它自己置为1
					c[m][n]=1;
				else
					c[m][n]=c[m-1][n-1]+1;	//在左上角元素基础上加上1
			}
		}
	}
	for(int i = 0; i < L1+1; i++)  //找出最大值,赋给maxSameLength          
	{
		for(int j = 0; j < L2+1; j++)  
		{	
			if(c[i][j]>maxSameLength)
				maxSameLength = c[i][j];
		}
	}
	pos.push_back(maxSameLength);
	
	for(int i = 0; i < L1+1; i++)  //找出最大值的位置         
	{
		for(int j = 0; j < L2+1; j++)  
		{	
			if(c[i][j]==maxSameLength)
				pos.push_back(i);
		}
	}
	return pos;	//终于pos中记录了最大公共子串的长度和在S1中位置
}

int main()
{
	char s1[30],s2[30];
	cout<<"输入俩字符串:";
	cin.getline(s1,30);
	cin.getline(s2,30);
	vector<int> results = prcs_2Strs(s1,s2);
	int num = results[0];
	int posEnd = results[1];
	if(num>0)
	{
		cout<<"最大公共子串元素数量为:"<<num<<endl;
		cout<<"最大公共子串元素:";
		for(int a=1;a<=num;a++)
			cout<<s1[posEnd-num+a];
	}
	return 0;
}

【华为OJ平台练习题】求最大公共子串的个数和元素