首页
学习
活动
专区
圈层
工具
发布

JavaScript求最大公共子串

求最大公共子串,常见的做法是使用矩阵。...假设有字符串:abcdefg和字符串abcd,则可构成如下矩阵      a    b    c    d    e    f    g a   1    0    0    0    0    0...然后求出对角线最长为1的那一段序列,即为最大公共子串。 看上面的分开,似乎得使用二维数组了,在两个字符串都较大的情况下不是很划算,是否可以进一步优化?...以一个字符串作为“行”,另一个作为“列”,比较两个字符串各项的值,用另外一个变量记录数组的最大值和字符串的起始位置 代码如下: function LCS(str1, str2) { if (str1...设有字符串a、b,其长度分别为len1、len2,其公共字子串一定是 子串必定连续,且一定是a、b的子串。

1.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java最大公共子串(动态规划)

    最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少。...比如:“abcdkkk” 和 “baabcdadabc”, 可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。...下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。 请分析该解法的思路,并补全划线部分缺失的代码。...这个有点dp的意思,分别计算两个字符串每一个字符到另一个字符是否相等 若相等 则加前面字符的最大字符串 若前面字符也分别相等则他就等于a[i-1][j-1]+1 若不想等则为0+1  测试数据1: abcdkkk...= s1.toCharArray(); char[] c2 = s2.toCharArray(); int[][] a = new int[c1.length + 1][c2.length

    54621

    答粉丝问|求给定字符串中最长公共子串

    再结合“公共”来看,可知公共子串必定由给定字符串集中最短字符串决定,所以小编想到了先选取出给定字符串集中最短的字符串进行切片操作。 如何选最短的字符串小编就不多说了,我们直接来看如何切片。...这里我们用abcde来举例,第一个子串肯定是abcde,然后判断其他几个字符串中是否都含有abcde这个子串,如果是就输出,这自然就是最长的公共子串了,如果不是,那就进入下一个循环。...第二个子串也就是四个字符的abcd,比对方法同上,同样四个字符的还有bcde,再三个字符的,abc,bcd,cde,两个字符的,ab,bc,cd,de,一个字符的,a,b,c,d,e。...分析完问题后,整理下思路,将其转化为程序语言。...(ss1[b:l-n+b],end=' ') #输出所有相同长度且都为最长公共子字符串的子字符串 if num2 == 1: break #如果循环完一种长度的所有种子字符串且找到了最长公共子字符串

    78520

    最长公共子串+最长公共子序列

    最长公共子串(注意子串是连续的) 1、先建立一个二维数组array[str1.size()][str2.size()](全部初始化为0),初始化第一行和第一列(元素相同处置1),然后进入状态方程 2、状态转移方程...3、最后寻找整个array中的最大值即可(因为可能有多个子串) 示意(图中有两个公共子串,分别为"ab"和"de",长度都为2) ?...程序: 1 /* 2 本程序说明: 3 4 最长公共子串(注意空格,不要用cin,要用getline) 5 6 */ 7 #include 8 #include...vector rv=v; 24 reverse(rv.begin(),rv.end()); 25 26 //这段程序其实就是原数组和逆序数组求公共子序列...,得到最大子序列的和, 27 //剩下要插入的数字之和就是原数组的和减去公共子序列的和 28 vector> dp(n+1,vector

    2.9K31

    最长公共子串

    最长公共子串 题目如下: 输入: x = ["", "a", "b", "c", "a", "d", "f"] y = ["", "a", "c", "b", "a", "d"],...状态转移方程 这题的状态转移方程该怎么定义呢,首先我们求的是两个字符串的公共子串,所以应该意识到这个 dp 方程是个二维数组 dp[i][j],代表的 x 的前 i 个字符串与 y 的 前 j 个字符串的最长公共子串...即可用如下公式表示 这也比较好理解,dp[0][i] 或 dp[j][0] 即空字符串与任意字符串的最大公共子串显然为0。...问题变形 以上我们只是简单求了一下最长公共子串的长度,那如何求其对应的子串呢。...还是根据状态状态转移来求,但我们要额外加两个变量 max_row, max_column 代表最长公共子串长度对应的格子的坐标。这样根据状态转移方程可以依次反求得其格子对应的字符,如图示: ?

    3K30

    最长公共子串 子序列

    本文记录寻找两个字符串最长公共子串和子序列的方法。...名词区别 最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别: 子串要求在原字符串中是连续的,而子序列则只需保持相对顺序...最长公共子串 是指两个字符串中最长连续相同的子串长度。 例如:str1=“1AB2345CD”,str2=”12345EF”,则str1,str2的最长公共子串为2345。...最长公共子序列 子串要求字符必须是连续的,但是子序列就不是这样。 最长公共子序列是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。...解法就是用动态回归的思想,一个矩阵记录两个字符串中匹配情况,若是匹配则为左上方的值加1,否则为左方和上方的最大值。一个矩阵记录转移方向,然后根据转移方向,回溯找到最长子序列。

    5.2K40

    最长公共子串

    题目: 思路: 如图: 思路一,利用动态规划的方法,列出全部结果来寻找规律,我们发现45度下滑,如果连续相等的话我们可以做递加,不但可以得出最长的字符串数量还可以知道字符的位置。...思路二,这是我看别人提供的一种思路,通过将一个字符串截取部分,然后判断是否在另一个字符串中,然后不断偏移直至全部比对完,这种空间上会相对思路一节约很多,毕竟少存了个数组。...     * 如:arr[2][2] = 1 则表示两个字符串相等 ,      * 而arr[3][3] = 2 , 表示承接上一个相同的字符串,再一次相同      * 这样可以通过获取最大值的同时获取到连续字符串的最终位置...     *      * @param str1 string字符串 the string      * @param str2 string字符串 the string      * @return...string字符串      */     public static String LCS(String str1, String str2) {         if (str1 == null

    76520

    最长公共子序列与最长公共子串

    (i, j)从0开始,那么递推关系很容易找到:(maxLen(i,j)表示s1字符串左边i个字符构成的子串与s2左边j个字符构成的子串的最长公共子序列长度,下同) if(s1[i-1] == s2[j-...maxLen(i,j) = maxLen(i-1,j-1) + 1; }else { maxLen(i,j) = max(maxLen(i,j-1), maxLen(i-1,j)); } 求最长公共子序列并输出...最长公共子串与上述最长公共子序列不一样,最长公共子串要求连续。...最长公共子串的输出比上面最长公共子序列简单,因为后者一定是连续的,我们只要保存最后一个两个字符串字符相等的位置index,以及最长公共子串的长度length,然后从index位置往回倒推index个字符即可...递推关系为: if(s1[i-1] == s2[j-1]) { maxlen(i, j) = maxLen(i - 1, j - 1) + 1 } 求最长公共子串并输出: #include<bits

    1.3K10
    领券