求两字符串最长公共连续子串---C++编程

题目:有两个字符串(可能包含空格),找出其中最长的公共连续子串,并输出其长度。 

输入描述:输入为两行字符串(可能包含空格),长度均小于等于50。
输出描述:  输出为一个整数,表示最长公共连续子串的长度。
输入例子:
abcde
abgde
输出例子:
2

两种参考思路如下:
(1)假设两个字符串str1和str2的长度分别为m和n,构建一个矩阵(即二维数组)M[m][n],初始值都设为0,如果字符串str1中

第i个字符str[i-1](下标从零开始)与字符串str2中第j个字符串str[j-1]相等,则将matric[i][j]设为1。最后统计矩阵M中对角线最大的连续1的个数,

即为两字符串最长公共子串。注:如不好理解,可以画图辅助。

/*例如:str1: abcde    str2: abgde  
                matrix = [ 1  0  0  0  0 
 
                  0  1  0  0  0
 
                  0  0  0  0  0
 
                  0  0  0  1  0
 
                  0  0  0  0  1 ]
 
    斜线上连续的1的最大个数为2,所以最长公共连续子串长度为2*/ 是每条对角线,而不只是主对角线。
参考代码如下:
#include <iostream>
#include <string>
using namespace std;
int main()
  {
      char str1[51],str2[51];
      int matric[51][51]={0};       
      int  MaxLen=0;
      gets(str1);   //cin.getline(str1,51);
      gets(str2);
      for(int i=0;str1[i]!='\0';i++)      //如果两个位置的元素相等,矩阵值为1
        {
           for(int j=0;str2[j]!='\0';j++)
              {
                 if(str1[i]==str2[j])
                     matric[i][j]=1;
              }
        }      
      for(int i=0;str1[i]!='\0';i++)      //依次找对角线最大连续1的个数
        {
           for(int j=0;str2[j]!='\0';j++)
              {
                 int m=i;
                 int n=j;
                 int len=0;
                 while(matric[m++][n++]==1)
                     len++;
                 if(MaxLen<len)
                     MaxLen=len;
              }
       }
     cout<<MaxLen<<endl;
  }
(2)运用动态规划的思想。

解题思路:

这题其实是动态规划的变形经典题型,应用动态规划的思想,创建一个二维数组dp[n][n],其中dp[i][j],表示取到s1[i]和取到s2[j]时的最大连续子串长度。如果s1[i]等于s2[j],则dp[i-1][j-1]等于取到s1[i-1]和取到s2[j-1]时的最大连续子串长度加1,即

dp[i][j]=dp[i-1][j-1]+1。


#include <stdio.h>
#include <string.h>
#define N 50
int main(){
     char s1[N],s2[N];
     int dp[N][N],i,j,max_len=0;
     gets (s1);
     gets (s2);
     for (i=0;i< strlen (s1);i++){
         for (j=0;j< strlen (s2);j++){
             if (s1[i]==s2[j]){
                 if (i>0&&j>0){
                     dp[i][j]=dp[i-1][j-1]+1;
                 } else {
                     dp[i][j]=1;
                 }
                 if (max_len<dp[i][j]){
                     max_len=dp[i][j];
                 }
             }
         }
     }
     printf ( "%d\n" ,max_len);
     return 0;
}

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
C++初级主要包括基本语法、数据类型、控制流程、函数、数组、指针等内容。下面是一个简单的介绍: 1. 基本语法:C++是一种面向对象的编程语言,使用分号作为语句结束符,使用花括号表示代码块。 2. 数据类型:C++提供了多种数据类型,包括整型、浮点型、字符型、布尔型等。可以使用关键字来声明变量,并进行初始化。 3. 控制流程:C++提供了条件语句(if-else语句、switch语句)和循环语句(for循环、while循环、do-while循环)来控制程序的执行流程。 4. 函数:C++中可以定义函数来封装一段可重用的代码。函数可以有参数和返回值,可以在函数内部进行各种操作。 5. 数组:C++中可以使用数组来存储一组相同类型的数据。数组可以通过索引访问元素,并可以进行遍历和操作。 6. 指针:C++中的指针是一种特殊的变量,它存储了内存地址。可以使用指针来访问和修改内存中的数据。 关于字符串连续回文的最大度,可以使用动态规划算法来解决。具体步骤如下: 1. 定义一个二维数组dp,其中dp[i][j]表示字符串从索引i到j的是否为回文。 2. 初始化dp数组,将所有度为1的都标记为回文。 3. 遍历字符串,从度为2的开始,依次判断每个是否为回文。如果是回文,则更新dp数组。 4. 在遍历过程中记录最的回文度。 5. 返回最的回文度。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rs勿忘初心

您的鼓励将是我的最大创动原动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值