动态规划:给出两个字符串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.不断的替换掉最大的长度并返回公共子串
  • 最后循环结束后,返回最大的公共子串
 1     public static String maxCommonString(String s1, String s2) {
 2         String res = "";
 3         if (s1 == null || s1.length() == 0 || s2 == null || s2.length() == 0)
 4             return res;
 5         int max = 0, m = s1.length(), n = s2.length();
 6         int[][] dp = new int[m][n]; // 定义一个二维数组记录最大公共子串的长度
 7         // 计算到s1的第i个字符和s2的第j个字符为止的最大公共子串长度
 8         for (int i = 0; i < m; i++) {
 9             for (int j = 0; j < n; j++) {
10                 // 如果s1字符串在i处和s2字符串在j处有字符相同,进入if代码块中
11                 if (s1.charAt(i) == s2.charAt(j)) {
12                     if (i == 0 || j == 0)
13                         dp[i][j] = 1;// 边界的情况
14                     else
15                         dp[i][j] = dp[i - 1][j - 1] + 1;// 加上当前长度
16                     // 记录最大长度和子串
17                     if (dp[i][j] > max) {
18                         max = dp[i][j];
19                         res = s1.substring(i - dp[i][j] + 1, i + 1);// substring()左闭右开
20                     }
21                 }
22             }
23         }
24         return res;
25     }

动态规划介绍

动态规划算法一般是基于一个递推公式(如上面的当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;
(分号都是英文格式的)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



猜您在找 【python】实例-python实现两个字符串中最大的公共子串 两个字符串的最长公共子串求法(C++、动态规划) 写一个函数,实现两个字符串的比较。即实现strcmp函数,s1=s2时返回0,s1!=s2时返回二者第一个不同字符的ASCII值。 给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。 编写一个程序,将两个字符串s1和s2比较,如果s1 > s2,输出一个整数;若s1 = s2,输出0;若s1 < s2,输出一个负数。不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相对应字符的ASCII码的差值。 8、将两个字符串s1,s2进行比较,如果s1>s2,则输出一个正数。如果s1 = s2,输出零。如果s1 < s2, 输出一个负数,不用strcmp函数,输出的正数或者负数的绝对值应该是比较两字符串相应字符的ascii码的差值。 编写一个程序,将连个字符串s1和s2比较,如果s1 > s2,输出一个整数;若s1 = s2,输出0;若s1 < s2,输出一个负数。不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相对应字符的ASCII码的差值。例如,"A"和“C”相比,由于"A" < "C",应输出负数,同时由于‘A’与‘C’的ASCII码差值为2,因此应输出"-2" 给出两个字符串,求出其最大的相同子串。 java 算法之 两个字符串中最大相同的子串 获取两个字符串中最大的相同子串
 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM