求最长公共子串,简单易懂
求两个字符串的最长公共子串
- 描述
- 算法思路
- 1.代码
- 2.动态规划
- 总结
描述
两个字符串,求出两个字符串最长公共字串的长度。
例如:
输入:abcdbeac acdbcdb
输出:3
算法思路
1.把两个字符串看成一个二维的矩阵;
2.比较矩阵中的点对应的行和列的字符是否相同,相同置为1,否则置为0;
3.找出其中值为1的最长对角线的长度,对应就是最长公共子串的长度。
例如: s1=abcdbeac
s2=acdbcdb
可以看出,最长的1对角线长度为4,最长公共子串长度为4。
1.代码
#include<stdio.h>
#include<string.h>
int LCS(char s1[],char s2[]){int len=0;int len1=strlen(s1);int len2=strlen(s2);if(s1==NULL || s2==NULL)return 0;for(int i=0;i<len1;i++){for(int j=0;j<len2;j++){int m=i;int k=j;int temp=0;while(m<len1 && k<len2 && s1[m]==s2[k]){//这里判断条件一个不能少temp++;m++;k++;}if(temp>len)len=temp; } }return len;
}int main(){char s1[10];char s2[10];int res;scanf("%s %s",&s1,&s2);res=LCS(s1,s2);printf("%d",res);return 0;
}
2.动态规划
进一步优化:
在给矩阵元素赋值时,可以边赋值边记录,即原本record[i][j]=1优化成record[i][j]=record[i-1][j-1]+1。
递推式:
if s1[i] != s2[j] dp[i][j]=0;
if s1[i] == s2[j] 若i=0||j=0 dp[i][j]=1;
else dp[i][j]=dp[i-1][j-1]+1;
上代码
int LCS(char s1[],char s2[]){int len=0;int len1=strlen(s1);int len2=strlen(s2);int dp[10][10];if(s1==NULL || s2==NULL)return 0;for(int i=0;i<len1;i++){for(int j=0;j<len2;j++){if(s1[i]==s2[j]){if(i==0 || j==0)dp[i][j]=1;elsedp[i][j]= dp[i-1][j-1]+1;}elsedp[i][j]=0; if(len<dp[i][j]) len=dp[i][j]; }}return len;
}
网上看到还有进一步优化
递推式:
if s1[i] != s2[j] dp[i][j]=0;
else dp[i][j]=dp[i-1][j-1]+1;
思路是循环从1开始,int型数组默认值为0。
上代码
int LCS(char s1[],char s2[]){int len=0;int len1=strlen(s1);int len2=strlen(s2);int dp[10][10]={0};if(s1==NULL || s2==NULL)return 0;for(int i=1;i<len1;i++){for(int j=1;j<len2;j++){if(s1[i]!=s2[j])dp[i][j]=0; elsedp[i][j]= dp[i-1][j-1]+1; if(len<dp[i][j]) len=dp[i][j]; } }return len;
}
总结
第一次写博客,如有错误,敬请赐教。
求最长公共子串,简单易懂相关推荐
- 【To Understand】动态规划:求最长公共子串/最长公共子序列
动态规划:求最长公共子串/最长公共子序列 本博客转载自:https://blog.csdn.net/u013074465/article/details/45392687 该博客中详细讲解了求最长公共 ...
- python求最长公共子串_Python-求解两个字符串的最长公共子序列
一.问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB.则这两个字符串的最长公共子序列长 ...
- 程序员面试题精选100题(20)-最长公共子串[算法]
题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串.注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中.请编写一个函数,输入两个字符串, ...
- 动态规划—最长公共子串
1.求最长公共子串的长度 问题描述:有两个字符串str和str2,求出两个字符串中最长公共子串长度.str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最 ...
- [XSY] 最长公共子串对(后缀自动机)
最长公共子串对 先放一段考场暴力代码: #include<iostream> #include<cstdio> #include<cstring> using na ...
- 2018.12.17-dtoj-1170-最长公共子串
题目描述: 给定两个字符串A和B,求最长公共子串. 算法标签:后缀数组 以下代码: #include<bits/stdc++.h> #define il inline using name ...
- UVa 10192 - Vacation amp; UVa 10066 The Twin Towers ( LCS 最长公共子串)
链接:UVa 10192 题意:给定两个字符串.求最长公共子串的长度 思路:这个是最长公共子串的直接应用 #include<stdio.h> #include<string.h> ...
- Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离
Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...
- 动态规划:求最长公共子序列和最长公共子串
最长公共子序列(LCS): 这同样是一道经典题目,定义就不说了. 为了方便说明,我们用Xi代表{x1,x2,‥xi},用Yj代表{y1,y2,‥yj}.那么,求长度分别为m,n的两个序列X,Y的LCS ...
- SPOJ1812(后缀自动机求n个串的最长公共子串)
题目:http://www.spoj.com/problems/LCS2/ 题意:给定n个串,求它们的最长公共子串. 思路就是:先将一个串建SAM,然后用后面的串去匹配,对于每一个串,保存最大值,对于 ...
最新文章
- educoder python入门之基础语法答案-Educoder Python入门之经典函数实例
- 一起学nRF51xx 13 - twi iic
- 如何用 C++ 在 10 行内写出八皇后?
- linux 音频驱动的流程,Intel平台下Linux音频驱动流程分析
- 【模拟】【codeforces】599B Spongebob and Joke
- curl的安装与简单使用
- 【转】Docker学习_本地/容器文件互传(5)
- Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计
- SAP License:ERP失败案例集
- AI 算法起家的今日头条为何败给了色情?
- 如何写好简历及如何准备面试(转)
- ENVI标准库下光谱分析
- 问答| 为什么四轮驱动机器人(SSMR)的质心(COM)没有横向分速度vy呢?
- python语言能做什么-python语言可以干什么
- RK平台计算GPIO对应的整型数
- 用企业微信管理微信客户有哪些好处?
- 我国计算机发展的四个阶段,计算机发展历程.ppt
- 电脑杀毒软件哪个好?好用的电脑杀毒软件推荐
- 【ZYNQ】从入门到秃头10 DDS增强版实验ADDA测试(基于ALINX 7020 AN108)
- Es6常见面试题必看!