zoukankan      html  css  js  c++  java
  • 【华为OJ平台练习题】求最大公共子串的个数和元素

    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;
    }
    



    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;
    }


  • 相关阅读:
    CTFHub-Web-Web前置技能-HTTP协议-响应包源代码详解
    BurpSuite环境安装及设置
    i2 Analyst’s Notebook 9学习笔记之入门、基本概念和数据接口
    Python 练习题:用索引取出LIST中的值
    python 练习题:小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点
    zabbix4.0 本地安装详解及步骤
    CentOS 7 安装 mysql 5.7.27 for zabbix
    win7系统 右击任务栏 资源管理器 弹出菜单“已固定”和“最近”项目不显示故障处理
    CentOS 7 新系统 手动配置网络 简要步骤
    CentOS7 firewalld防火墙 启动 关闭 禁用 添加删除规则等 常用命令
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8849247.html
Copyright © 2011-2022 走看看