求两字符串最长公共连续子串---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 <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;
}
解题思路:
这题其实是动态规划的变形经典题型,应用动态规划的思想,创建一个二维数组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;
}
求两字符串最长公共连续子串---C++编程相关推荐
- 【算法】算法测试题4:最长公共连续子串
问题描述 链接:https://www.nowcoder.com/ques... 来源:牛客网 给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度. 输入描述 输入为两行字符串(可 ...
- 最长公共连续子串LCS
(对比最长公共连续子序列) 暴力n3 用dp来优化 简书:https://www.jianshu.com/p/730a78212c65 CSDN:https://blog.csdn.net/ten_s ...
- 美团点评_给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。
给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度. import java.util.*; public class Meituan_4 {public static void ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- java 求最长重复子串_给定一个字符串,求出其最长的重复子串。
#include #include #include #include using namespace std; //给定一个字符串,求出其最长的重复子串 //方法一 string lsubstr_1 ...
- 数据结构 - 字符串 - 最长公共子序列 + 最长公共子字符串 - 动态规划
最长公共子序列 /*** 最长公共子序列* 参考链接:http://blog.csdn.net/biangren/article/details/8038605* Created by 18710 o ...
- BNUOJ 4215 最长公共连续子序列
最长公共连续子序列 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class na ...
- 字符串最长回文子串_最长回文子串
字符串最长回文子串 Problem statement: 问题陈述: Given a string str, find the longest palindromic substring. A sub ...
- java 求两线交点_JAVA求两直线交点和三角形内外心的编程代码
JAVA求两直线交点和三角形内外心的编程代码 一.求两直线交点 复制代码 代码如下: class Point { double x; double y; public Point() { this.x ...
最新文章
- 今日头条李磊等最新论文:用于文本生成的核化贝叶斯Softmax
- 如何快速融入团队(六)
- Python中type()详解:动态创建类
- Fiddler抓取https相关设置
- java html entity encoding,实体“HTML.Version”的声明必须以''结尾
- java面向对象高级分层实例_接口类
- PTA-7-3 A除以B (10分)
- linux服务进程文件,[Linux实用命令]-6-服务与进程管理
- JS 数组去重的几个方法
- linux sudo输入密码无法获得锁,Linux系统提示无法获得锁/var/lib/dpkg/lock怎么办?
- mybatis多对一,一对一,多对多resultMap映射,pojo映射,传参集合,封装的对象传参
- java兄弟_java实现兄弟孩子树代码
- solidity教程【0.5.7】
- 一不做,二不休, 干脆把开局库更换的批处理文件也调试好放出来...
- vue3 tinymce富文本插件
- 浏览历史记录通用代码
- 【Python】音节判断
- 计算机启动硬盘自检,启动时硬盘自检?这样处理就没事了
- 软件充值功能测试点有哪些?以手机话费充值为例
- tar -zxvf是什么意思
热门文章
- [oracle 10g]命令行启动ORACLE服务及顺序
- Linux平台-小型企业DHCP服务器的搭建
- Linux shell配置环境变量
- 京东购物车双11实战
- 数据结构与算法之-----二叉树(一)
- mysql多索引结构_MySQL-索引结构详解
- 机械硬盘旋转时间_高端PC真的没有机械盘了么?
- 2021泰安市地区高考成绩排名查询,2021年山东高考成绩排名及一分一段表
- hbase针对fullgc所做的优化(Memstore所作的优化 针对BlockCache所作优化)
- 沉迷Link-Cut tree无法自拔之:[BZOJ2594][Wc2006]水管局长数据加强版