动态规划:给出两个字符串s1和s2,返回其中最大的公共子串
求公共子字符串问题(连续的)
这个题目是当时远景能源公司现场笔试的一道题目,当时根本就不知道动态规划是什么鬼,直接上来就暴力求解,面试官很谄媚的问我,你这能求出来吗?当时很年轻的说,能啊!现在想,当时哪来的自信和逗比勇气说这大话。。。在《进军硅谷》这本书上看到原题,我是懵逼,怎么想出这种解答出来的,下面直接上思路和代码。
思路:
定义二维数组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;或 ;
全方的空白&emsp;或 ;
不断行的空白格 ;或 ;
(分号都是英文格式的)
动态规划:给出两个字符串s1和s2,返回其中最大的公共子串的更多相关文章
- Java算法——求出两个字符串的最长公共字符串
问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. 例如:“acbbsdef”和"abbsced"的最长公共字符串是“bbs” 算法思路: 1.把两个字符串分别 ...
- C语言:求n(n<10000)以内的所有四叶玫瑰数。-将字符串s1和s2合并形成新的字符串s3,先取出1的第一个字符放入3,再取出2的第一个字符放入3,
//函数fun功能:求n(n<10000)以内的所有四叶玫瑰数并逐个存放到result所指数组中,个数作为返回值.如果一个4位整数等于其各个位数字的4次方之和,则称该数为函数返回值. #incl ...
- [华为]查找两个字符串a,b中的最长公共子
链接:https://www.nowcoder.com/questionTerminal/181a1a71c7574266ad07f9739f791506来源:牛客网 查找两个字符串a,b中的最长公共 ...
- Java实现 LeetCode 583 两个字符串的删除操作(求最长公共子序列问题)
583. 两个字符串的删除操作 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例: 输入: " ...
- 389. Find the Difference 找出两个字符串中多余的一个字符
[抄题]: Given two strings s and t which consist of only lowercase letters. String t is generated by ra ...
- js判断出两个字符串最大子串的函数
<!DOCTYPE html><html><head> <title></title></head><script typ ...
- poj 2774 后缀数组 两个字符串的最长公共子串
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 31904 Accepted: 12 ...
- 动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串
LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. 选出最长公共子序列.对于长度为n的序列, ...
- Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings)
Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings) 给定两个字符串s1, s2,找到 ...
随机推荐
- Java-IO之CharArrayWriter(字符数组输出流)
CharArrayWriter用于写数据,数据单位是字符. (1) 通过CharArrayWriter()创建的CharArrayWriter对应的字符数组大小是32. (2) 通过CharArray ...
- 95%的bug是由程序员造成的
原文作者:Jeff Atwood 作者在Twitter上发的一条短讯: "在怨天尤人之前,我们应该先自我反省.努力把自身的问题解决了." 12:22 PM –2012-5-30 你 ...
- Django练习——博客系统小试
在上一篇博客Todolist的基础上(http://blog.csdn.net/hcx25909/article/details/24251427),本周继续进行实践,这次我要搭建一个简单的博客系统. ...
- 常用Petri网模拟软件工具简介
常用Petri网模拟软件工具简介 首先要介绍的的一个非常有名的Petri 网网站--Petri Nets World: http://www.informatik.uni-hamburg. ...
- UILabel-UITextField-UIBotton UI_…
注意:AppDelegate是类,所以self在这个类中指的就是AppDelegate对象 - (BOOL)application:(UIApplication *)application didFi ...
- (三十四)NavigationController初步
为了了解底层,首先不基于UIWindow而基于UIWindow来创建App. 由于Xcode6没有以前的基于UIWindow的空项目,所以选择SingleView,然后删除storyboard,移除B ...
- java,http的post和get
使用Java发送GET.POST请求 --节选自<疯狂Java讲义> URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 UR ...
- 【一天一道LeetCode】#45. Jump Game II
一天一道LeetCode系列 (一)题目 Given an array of non-negative integers, you are initially positioned at the fi ...
- 【翻译】Ext JS 4——Ajax和Rest代理处理服务器端一场和消息的方法
原文:EXTJS4 - Handle Server-side exceptions and message from an Ajax or Rest proxy 作者:Raja 可能要处理的情况:su ...
- C#之结尾篇
在Top10语言中,C#是最优美的语言,没有之一,在Top10语言中,C#所可用的标准库及可获得其他库是最强大的之一,这个必须带上之一,因为有java在,在Top语言中,C#语言是性能最高的语言之一, ...