动态规划:给出两个字符串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,找到 ...
随机推荐
- HttpClient4登陆有验证码的网站
其实就这个问题,本来是很简单的,我自己花了近两个下午才搞定,现在记录一下.也希望能帮助后来的朋友. 先说httpclient 操蛋的httpclent! 为什么说操蛋呢,因为从httpclient ...
- 【一天一道LeetCode】#113. Path Sum II
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- android 网络通信框架volly
1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient( ...
- 图文浅析Binder机制
总述: Binder是Android系统提供的一种IPC机制,Android系统基本就可以看做基于Binder的C/S架构,Binder也是C/S形式出现,它属于驱动但是驱动的一段内存而不是设备,框架 ...
- mixer: sql词法分析器设计
介绍 mixer希望在proxy这层就提供自定义路由,sql黑名单,防止sql注入攻击等功能,而这些的基石就在于将用户发上来的sql语句进行解析.也就是我最头大的词法分析和语法分析. 到现在为止,我只 ...
- [WinForm]dataGridView动态加载以本地图片显示列
增加一个图片列: C# private void btnQuery_Click(object sender, EventArgs e) { StringBuilder sb=new StringBui ...
- 一个炫字都不够??!!!手把手带你打造3D自定义view
分享一则最近流行的笑话: 最新科学研究表明:寒冷可以使人保持年轻,楼下的王大爷表示虽然今年已经60多岁了,但是仍然冷的跟孙子一样. 呃.好吧,这个冬天确实有点冷,在广州活生生的把我这个原生北方人,冻成 ...
- DBUtils学习总结
这几天闲着无聊,就看了一下DBUtils这个数据库组件.中间有了一些想法,现在记录下来. 文章主要分几部分 1 最简单同时也是最经常使用的一些范例 2 学习源码前的一些知识储备 3 我自己写的mydb ...
- Linux 删除目录与文件
Linux 删除目录与文件 在当前目录下查找所有.svn的目录 $ find . -type d -name ".svn" 删除当前目录下所有.svn的目录 $ find . -t ...
- 循环链表设计与API实现
基本概念 循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素 循环链表拥有单链表的所有操作 创建链表 销毁链表 获取链表长度 清空链表 获取第pos个元素操作 插入元素到位置pos ...