Given two strings ‘X’ and ‘Y’, find the length of the longest common substring. For example, if the given strings are “GeeksforGeeks” and “GeeksQuiz”, the output should be 5 as longest common substring is “Geeks”
Let m and n be the lengths of first and second strings respectively.
A simple solution is to one by one consider all substrings of first string and for every substring check if it is a substring in second string. Keep track of the maximum length substring. There will be O(m^2) substrings and we can find whether a string is subsring on another string in O(n) time (See this). So overall time complexity of this method would be O(n * m2)
Dynamic Programming can be used to find the longest common substring in O(m*n) time. The idea is to find length of the longest common suffix for all substrings of both strings and store these lengths in a table.
The longest common suffix has following optimal substructure property LCSuff(X, Y, m, n) = LCSuff(X, Y, m-1, n-1) + 1 if X[m-1] = Y[n-1] 0 Otherwise (if X[m-1] != Y[n-1]) The maximum length Longest Common Suffix is the longest common substring. LCSubStr(X, Y, m, n) = Max(LCSuff(X, Y, i, j)) where 1 <= i <= m and 1 <= j <= n
Implementation:
public String getLongestCommonString(String a, String b) { int m = a.length(), n = b.length(); int[][] f = new int[m+1][n+1]; int max = 0; String lcs = ""; for(int i=1; i<=m; i++) { for(int j=1; j<=n; j++) { if(a.charAt(i-1) == b.charAt(j-1)) { f[i][j] = f[i-1][j-1]+1; if(f[i][j] > max) { max = f[i][j]; lcs = a.substring(i-max, i); } } } } return lcs; }
Time Complexity: O(m*n)
Auxiliary Space: O(m*n)
The longest substring can also be solved in O(n+m) time using Suffix Tree.
References:
http://en.wikipedia.org/wiki/Longest_common_substring_problem
http://www.geeksforgeeks.org/longest-common-substring/
http://www.geeksforgeeks.org/suffix-tree-application-5-longest-common-substring-2/
相关推荐
LCS(longest common substring)算法,即最大公共子串,它是求两个字符串最长公共子串的问题。大体解法是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长...
4. 额外的测试部分:定义了一个`expect`函数来检验`longestCommonSubstring`函数的输出是否符合预期。通过传入实际的计算结果和期望的值,用toBe方法进行比较,并打印出比较结果,方便调试。 在给出的测试用例中,...
最长公共子字符串共有两种解决方法,下面具体说说我的思路方法一:Longest Common Substring和Longest Common Subsequence是有区别的X = <a>Y = <a>X和Y的Longest Common Sequence为,长度为4X和Y的Longest Common ...
在编程领域,寻找两个字符串之间的最长公共子字符串(Longest Common Substring,LCS)是一个经典的问题,它在文本处理、生物信息学以及许多其他应用中都有重要用途。本问题要求我们编写一个程序来解决这个问题,...
该方法首先使用`removeSign`方法将输入字符串中的符号去除,然后使用`longestCommonSubstring`方法计算两个字符串之间的最长公共子串。最后,该方法使用以下公式计算相似度: 相似度 = (最长公共子串的长度 / 较大...
最长公用子串LCS服务器 最长公共子字符串(LCS)服务器概述构建一个简单的Web应用程序,允许用户在给定字符串列表的情况下请求最长公共子字符串。... POST请求的主体必须是JSON对象,它以以下格式表示一组字符串:{“ ...
`longestCommonSubstring.cpp`涉及到字符串处理,其算法可能采用了动态规划来找到两个字符串中最长的公共子序列。 7. **图解示例**: 文件`Figure7-30.cpp`和`Figure9-17.cpp`可能包含了某种算法的图形化示例,...
需要注意的是,LCS问题与最长公共子串(Longest Common Substring)问题不同。最长公共子串是指在两个或多个序列中找到最长的连续子串,而LCS问题是指在两个或多个序列中找到最长的公共子序列。 TWO concepts are ...
此外,还有一个相似的问题是最长公共子串(Longest Common Substring,简称LCSs),与LCS的区别在于子串必须是连续的。在示例代码中,同样是通过动态规划求解,但当发现子串时,记录最大长度`rst`并清零当前位置的`...
Java中的动态规划法被广泛应用于解决复杂的问题,如求解最长公共子序列(Longest Common Subsequence, LCS)和最长公共子字符串(Longest Common Substring, LSS)。这两个概念在计算机科学中尤其是在字符串处理和...
6. 密码学(Cryptography):涉及加密与解密技术,如有限状态机最小化(Finite State Machine Minimization)以及最长公共子串(Longest Common Substring)和最短公共父串(Shortest Common Superstring)等问题。...
这与最长公共子串(Longest Common Substring)不同,子串要求字符连续,而子序列则没有这个限制。 LCS算法主要应用于找出两个序列之间的最长公共部分,而不考虑它们在原始序列中的位置是否连续。这种算法在多种...
Longest Common Substring. The following are some instances. X: xzyzzyx Y: zxyyzxz X:MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCALLAAQANKESSSESFISRLLAIVAD Y:...
在C++实现中,我们通常会创建一个函数,如`longestCommonSubstring(const string &s, const string &t)`,并在这个函数内部构建动态规划的逻辑。同时,为了获取最长公共子串本身,我们还需要记录下这个子串的起始...
章节中介绍的编辑距离(Edit Distance)、加权作业调度算法(Weighted Job Scheduling Algorithm)、最长公共子序列(Longest Common Subsequence)、斐波那契数(Fibonacci Number)、最长公共子串(Longest Common...
例如,`addPolynomials.cpp`可能实现多项式加法的算法,`longestCommonSubstring.cpp`则可能是寻找两个字符串最长公共子序列的算法。 3. 哈希函数与哈希表:`hash.cpp`可能包含了哈希函数的设计和哈希表的实现。...
接着,文件提到了最大公共子串(Longest Common Substring)的问题。这是一个经典的动态规划问题,需要编写程序来找出两个字符串中公共的最长子串。在这个场景中,使用了数组(如int substr[100])来存储中间结果,...
常见的编辑距离计算方法有两种:莱文斯坦距离(Levenshtein distance)和最长公共子串长度(Longest common substring length)。莱文斯坦距离允许三种操作:增加、删除和替换字符,而最长公共子串长度仅允许增加和...
`trie.cpp`可能讨论字典树或前缀树的数据结构,`addPolynomials.cpp`涉及多项式加法,`longestCommonSubstring.cpp`实现求解最长公共子串的算法,`Figure7-30.cpp`和`Figure9-17.cpp`可能是书中特定章节的示例代码。...
最长公共子串(Longest Common Substring,LCS)是一个在计算机科学中常见的字符串处理问题,它涉及到查找两个或多个字符串中的最长连续子序列,这个子序列同时存在于所有字符串中。MFC,全称为Microsoft Foundation...