求公共子字符串问题(连续的)

这个题目是当时远景能源公司现场笔试的一道题目,当时根本就不知道动态规划是什么鬼,直接上来就暴力求解,面试官很谄媚的问我,你这能求出来吗?当时很年轻的说,能啊!现在想,当时哪来的自信和逗比勇气说这大话。。。在《进军硅谷》这本书上看到原题,我是懵逼,怎么想出这种解答出来的,下面直接上思路和代码。

思路:

定义二维数组dp[i][j]记录最大公共子串的长度,

  • 若要返回字符串可以用s1.substring(i-dp[i][j]+1, i+1)
  • 当s[i]==s[j]时,dp[i][j]=dp[i-1][j-1]+1;
  • 当s[i]!=s[j]时,dp[i][j]=0;

有点类似于数学归纳法

方案:

  • 首先考虑空或者长度为0的情况,直接返回"";
  • 然后进入双重循环:
  • 1.利用charAt(int index)方法来比较两个字符串相等的时机
  • 2.考虑边界情况,两个字符串中有一个是起始为0就相等,则dp[i][j]=1
  • 3.除了边界情况,其他最大字符串长度为dp[i][j]=dp[i-1][j-1]+1;
  • 4.不断的替换掉最大的长度并返回公共子串
  • 最后循环结束后,返回最大的公共子串
     public static String maxCommonString(String s1, String s2) {
String res = "";
if (s1 == null || s1.length() == 0 || s2 == null || s2.length() == 0)
return res;
int max = 0, m = s1.length(), n = s2.length();
int[][] dp = new int[m][n]; // 定义一个二维数组记录最大公共子串的长度
// 计算到s1的第i个字符和s2的第j个字符为止的最大公共子串长度
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
// 如果s1字符串在i处和s2字符串在j处有字符相同,进入if代码块中
if (s1.charAt(i) == s2.charAt(j)) {
if (i == 0 || j == 0)
dp[i][j] = 1;// 边界的情况
else
dp[i][j] = dp[i - 1][j - 1] + 1;// 加上当前长度
// 记录最大长度和子串
if (dp[i][j] > max) {
max = dp[i][j];
res = s1.substring(i - dp[i][j] + 1, i + 1);// substring()左闭右开
}
}
}
}
return res;
}

动态规划介绍

动态规划算法一般是基于一个递推公式(如上面的当s[i]==s[j]时,dp[i][j]=dp[i-1][j-1]+1;)以及一个或多个初始状态(当s[i]!=s[j]时,dp[i][j]=0;),当前子问题其实是由上一次子问题的解推算出来的。
【附带福利:markdown每行缩进的方式】

半方的空白&ensp;或&#8194;
全方的空白&emsp;或&#8195;
不断行的空白格&nbsp;或&#160;
(分号都是英文格式的)

动态规划:给出两个字符串s1和s2,返回其中最大的公共子串的更多相关文章

  1. Java算法——求出两个字符串的最长公共字符串

    问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. 例如:“acbbsdef”和"abbsced"的最长公共字符串是“bbs” 算法思路: 1.把两个字符串分别 ...

  2. C语言:求n(n<10000)以内的所有四叶玫瑰数。-将字符串s1和s2合并形成新的字符串s3,先取出1的第一个字符放入3,再取出2的第一个字符放入3,

    //函数fun功能:求n(n<10000)以内的所有四叶玫瑰数并逐个存放到result所指数组中,个数作为返回值.如果一个4位整数等于其各个位数字的4次方之和,则称该数为函数返回值. #incl ...

  3. [华为]查找两个字符串a,b中的最长公共子

    链接:https://www.nowcoder.com/questionTerminal/181a1a71c7574266ad07f9739f791506来源:牛客网 查找两个字符串a,b中的最长公共 ...

  4. Java实现 LeetCode 583 两个字符串的删除操作(求最长公共子序列问题)

    583. 两个字符串的删除操作 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例: 输入: " ...

  5. 389. Find the Difference 找出两个字符串中多余的一个字符

    [抄题]: Given two strings s and t which consist of only lowercase letters. String t is generated by ra ...

  6. js判断出两个字符串最大子串的函数

    <!DOCTYPE html><html><head> <title></title></head><script typ ...

  7. poj 2774 后缀数组 两个字符串的最长公共子串

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 31904   Accepted: 12 ...

  8. 动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串

    LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. 选出最长公共子序列.对于长度为n的序列, ...

  9. Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings)

    Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings) 给定两个字符串s1, s2,找到 ...

随机推荐

  1. 记录最近的几个bug

    记录最近出的几个bug connection reset by peer 最近服务器经常性的出现connection reset by peer的错误,开始我们只是以为小概率的网络断开导致的,可是随着 ...

  2. Linux IPC实践(8) --共享内存/内存映射

    概述 共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据(如图). 共享内存 VS ...

  3. Android启动过程分析

    Android系统启动过程 首先看一张Android框架结构图 Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用. 启动的过程如下图所示:(图片来自网上, ...

  4. JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块

    JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...

  5. 断言(Assertion)需要注意的一个地方

    因为断言只在debug构建中有效,所以它是中关重要的去避免运行任何代码或调用任何方法在断言条件中,而这些代码或方法会影响程序的状态. 否则程序的行为将在debug和release构建中变得不一致,这显 ...

  6. SpriteBuilder中粒子发射器的reset on visibility toggle选项解释

    如果选中该选择框,表示粒子发射器将删除所有已存在的粒子当它们的可见状态被代码改变的时候. 如果该选择框没有选中,则发射器将保持产生粒子但不渲染它们(意思是有但你看不到)当它们的可视状态为NO的时候. ...

  7. imx51-linux的cpuinfo之分析

    这两天客户提出来,我们的平板cat /proc/cpuinfo出来的信息中的serial怎么是0. 客户就是上帝啊,没办法,分析找问题贝. 我们先看一下目前的cat /proc/cpuinfo的信息: ...

  8. SpriteBuilder中音频文件格式的需要注意的地方

    就像在SpriteBuilder项目子目录中的其他资源文件一样,音频文件夹需要确定完整的文件夹路径. 并且如果音频文件输出格式为MP4,则扩展为.m4a(audio-only MPEG4)而不是.mp ...

  9. Bookmarkable Pages

      Build a Bookmarkable Edit Page with JDeveloper 11g Purpose In this tutorial, you use Oracle JDevel ...

  10. 怎样重建一个损坏的调用堆栈(callstack)

    原文作者:Aaron Ballman原文时间:2011年07月04日原文地址:http://blog.aaronballman.com/2011/07/reconstructing-a-corrupt ...