算法系列——最长公共子串
来源:互联网 发布:淘宝回收十字绣靠谱吗 编辑:程序博客网 时间:2024/06/06 13:04
题目描述
给出两个字符串,找到最长公共子串,并返回其长度。
注意事项
子串的字符应该连续的出现在原字符串中,这与子序列有所不同。
样例
给出A=“ABCD”,B=“CBCE”,返回 2
解题思路
应用动态规划,状态方程为 dp[i][j]表示
dp[i][j]表示Xi和Yi的最大Substring的长度,比如对于X和Y
X = <y, e, d, f> Y = <y, e, k, f>
dp[0][0]=1;dp[1][1]=2;dp[d][k]=0;dp[f][f]=1;
动态转移方程为:
如果xi == yj, 则 dp[i][j] = dp[i-1][j-1]+1
如果xi ! = yj, 那么dp[i][j] = 0
最后求Longest Common Substring的长度等于
max{ dp[i][j], 1<=i<=n, 1<=j<=m}
程序实现
public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common substring. */ public int longestCommonSubstring(String A, String B) { if(A==null||A.length()==0||B==null||B.length()==0) return 0; int m=A.length(); int n=B.length(); int[][] dp=new int[m][n]; int maxLen=0; //初始化第一行 for(int i=0;i<n;i++){ if(A.charAt(0)==B.charAt(i)){ dp[0][i]=1; maxLen=1; } else dp[0][i]=0; } //初始化第一列 for(int j=0;j<m;j++){ if(A.charAt(j)==B.charAt(0)){ dp[j][0]=1; maxLen=1; } else dp[j][0]=0; } for(int i=1;i<m;i++) for(int j=1;j<n;j++){ if(A.charAt(i)==B.charAt(j)) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=0; maxLen=Math.max(maxLen,dp[i][j]); } return maxLen; }}
阅读全文
0 0
- 算法系列——最长公共子串
- 算法导论—最长公共子串
- 算法系列笔记6(动态规划—最长公共子序列/串lcs和最长递增子序列(LIS))
- 算法导论—最长公共子序列
- 算法导论—最长公共子序列
- 顺序串算法——最长公共子序列
- 算法期中——最长公共子串
- 阿里面试题—最长公共子串算法
- 最长公共子串[算法]
- 算法12—动态规划算法之:最长公共子序列 & 最长公共子串(LCS)
- 字符串系列---最长公共子串
- 最长公共子串与最长连续子串算法
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
- 算法:最长递增子序列、最长公共子串
- 最长公共子串LCS算法
- 最长公共子串LCS算法
- [算法导论读书笔记]最长公共子串
- LCS算法求最长公共子串
- web.xml
- sanic的安装/Request/中间件/异常
- 深入理解Activity启动模式之launchMode
- Hibernate的Disjunction和Conjunction
- uva 10391
- 算法系列——最长公共子串
- Android 环境搭建时的下载问题
- SPV、SPV节点和SPV钱包
- struts.properties
- Android 7.0之后安装APK,拍照 出现FileUriExposedException,多个provider配置
- golang语言-2-go基本语法
- 表单(三)选择框
- JQuery进行Ajax请求的四种方式
- 快速排序