查找两个字符串a,b中的最长公共子串_牛客题霸_牛客网

1.找a 和 b 的最长公共子串实际上是在a的子串和b的子串中找最长公共子串

ins[i][j]实际上记录的就是 以a的第i个字符和以b的第j个字符结尾的子串中存在的最长公共子串的长度

接下来我们举个例子:

a: abcabcde

b: abcd

ins[1][1] = 'a'  'a'  --> 'a'  1

ins[2][2] = 'ab'  'ab' --> 'ab'  2

ins[3][3] = 'abc' 'abc' --> 'abc' 3

ins[4][4] = 'abca' 'abcd' --> 0

到了ins[4][4] 的我卡住了,当时想的是ins[4][4] 就是a的子串 abca  b的子串abcd中存在的最长公共子串应该是abc 那么这个值是3 而不是0

我们先跳过一下:找一下这个整体规律:

如果以第i个字符结尾的字符和以第j个字符结尾的字符相等,那么

ins[i][j] = ins[i-1][j-1] + 1  (很明显前面三个都是满足的)

假如不相等,ins[i][j] = 0

但是为什么不是 ins[i][j] = ins[i-1][j-1]

接下来分析一下:实际上按照ins[4][4] = ins[3][3] = 3的说法是不完全准确的,为什么?

假设哈: a = abcdh

b = abcjh

ins[3][3] = 3

这里用假设性原则:ins[i][j] = ins[i-1][j-1]

ins[4][4] = ins[3][3] = 3

ins[5][5] = ins[4][4] +1 = 4

实际上呢??? ins[5][5] 的最常公共子串长度是3 ,这个我们一样就可以看出来,那么按照我们那种假设性原则导致了变成了求最长公共子序列的问题(也就是不连续即可)

除非你能保证你i j 不相等且是最后一个的时候才能说明 ins[i][j] = in[i-1][j-1],但是之前的是不行的

所以这个地方着重解释了当两个字符不相等的时候为什么不是ins[i][j] = ins[i-1][j-1]

2.那么ins[i][j] != ins[i-1][j-1] 究竟结果是啥呢??? 实际上这里你可以设置为0

因为你设置成0不影响结果得,你之前的ins[3][3] = 3实际上是把这个最长子串的长度记录下来了,不必去在ins[4][4] 里搅混水

当我们去遍历这个二维数组的时候,一定是记录下了这个最长子串,当你再去更新的时候就行

3.那么这个起始位置如何判断???

start = i - max, 我们是从短字符串来判定的, 你确定了这个最长子串,肯定是最后一个位置是

i  而且你的最后一个字符相等说明 i之前的max个字符都相等,那么从 (i - max,i)就是最长子串

import java.io.*;
import java.util.*;
public class Main{public static void main(String[] args) throws Exception{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String str;while((str = br.readLine())!=null){String ss = br.readLine();if(str.length()<ss.length()){System.out.println(res(str,ss));}else{System.out.println(res(ss,str));}}}public static String res(String s,String c){char[] ch1 = s.toCharArray();char[] ch2 = c.toCharArray();int[][] ins = new int[ch1.length + 1][ch2.length + 1];int max = 0;int start = 0;for (int i = 1; i < ch1.length; i++) {for (int j = 1; j < ch2.length; j++) {if(ch1[i-1]==ch2[j-1]){ins[i][j] = ins[i-1][j-1]+1;if(ins[i][j]>max){max = ins[i][j];start = i-max;}}}}return s.substring(start,start+max);}
}

最长公共子串(动态规划)相关推荐

  1. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  2. 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用

    2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...

  3. 动态规划 dp03 最长公共子串问题 c代码

    题目: 若序列Z是序列X的子序列,又是Y的子序列,则称Z是序列X与Y的公共子序列.例如序列"bcba"是序列"abcbdab"与"bdcaba&quo ...

  4. 动态规划--最长公共子串

    找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.其实这又是一个序贯决策问题,可以用动态规划来求解.我们采用一个二维矩阵来记录中间的结果.这个二维矩阵怎么构造呢?"bab&quo ...

  5. 动态规划—最长公共子串

    1.求最长公共子串的长度 问题描述:有两个字符串str和str2,求出两个字符串中最长公共子串长度.str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最 ...

  6. 动态规划之最长公共子串

    一 问题引入 在生物学中,经常需要比较两个不同生物的DNA,一个DNA串由由一串称为碱基的的分子组成,碱基有鸟嘌呤,腺嘌呤,胞嘧啶,胸腺嘧啶四中,我们用英文字母的首字母表示四种碱基,那么DNA就是在有 ...

  7. 两个字符串的最长公共子序列长度_【面试】动态规划-之最长公共子序列、最长公共子串问题...

    先来说明下什么是最长公共子序列,什么是是最长公共子串,举一个实际例子,myblogs与belong,最长公共子序列为blog(myblogs, belong),最长公共子串为lo(myblogs, b ...

  8. 动态规划——最长公共子串,没有比这更通俗易懂的了

    前言 动态规划是大厂的热门考点,其中最长公共子串与最长公共子序列这两道题出现得尤其频繁,这两道题其实有挺多变种,很适合考察侯选人对动态规划的掌握情况,今天我们就先来看看如何求解最长公共子串,图文并茂, ...

  9. 动态规划算法之:最长公共子序列 最长公共子串(LCS)

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...

  10. 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)

    动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...

最新文章

  1. chrome应用程序无法启动因为并行配置不正确的处理办法(亲测版本不一样也是类似的操作)
  2. storm metric的使用说明
  3. 【 Tomcat 】tomcat8.0 调优配置
  4. c++可以做什么项目_上班做下班后可以做的兼职项目
  5. 王飞跃教授:生成式对抗网络GAN的研究进展与展望
  6. 动画学信奥 漫画学算法 CSP-J入门级 (三)、算法(依据「NOI大纲」)
  7. C while 循环
  8. 脚本命令配置mysql_MySQL常用的配置、脚本和命令
  9. CSS : Cascading Style Sheets
  10. 【福利】本人自学深度学习的300G的学习资料愿与大家分享!一起进步!
  11. 关于SVM参数cg选取的总结帖[matlab-libsvm]
  12. 通过软件调整显示器的扩展、复制、显示器输入源
  13. P5713 【深基3.例5】洛谷团队系统(C语言)
  14. 微信公众号配置失败问题解决方法
  15. 窗口置顶工具v2.1.0
  16. This computer doesn’t have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory“!
  17. linux boot引导修复工具,修复linux的grub2引导(单独/boot,lvm-root)
  18. HTML5+JavaScript调用摄像头拍照或者摄像
  19. GRBL-1:平台搭建
  20. 苹果再次确立其移动王者地位

热门文章

  1. depends.exe 使用说明
  2. 利用Depends查看win系统下exe程序的依赖项
  3. 【机器学习】实验5布置:基于K-近邻的车牌号识别
  4. 基于K—近邻的车牌号识别小实验
  5. linux如何配置本地yum,Linux配置本地yum源配置方法
  6. 职称计算机题库 云盘,职称计算机考试题库「附答案」
  7. XMLSpy的主要功能介绍
  8. 91卫图助手下载器永久免费啦!!
  9. ListView优化之ViewHolder
  10. 微PE安装win10系统 GPT、BOOTMGR PBR、EFI PART红色