Longest Common Substring
给出两个字符串,找到最长公共子串,并返回其长度。
注意事项
子串的字符应该连续的出现在原字符串中,这与子序列有所不同。
Lintcode上的一道题目,非常经典,需要找到最长的连续公共子串的长度。
因为有两个序列且前后顺序不可以打乱,所以为双序列问题。
这种问题比较重要的是定义状态。这里将状态f[i][j]定义为以A的第i 个字符和B的第j个字符为结尾的最长公共子串的长度。如果A[i-1]!=B[j-1],则f[i][j]=0。
如果A[i-1]==B[j-1],则f[i][j] =f[i-1][j-1]+1。代码如下:
class Solution: # @param A, B: Two string. # @return: the length of the longest common substring. def longestCommonSubstring(self, A, B): if not A or not B: return 0 res = [[0 for i in xrange(len(B)+1)] for j in xrange(len(A)+1)] maxlen = 0 for i in xrange(1,len(A)+1): for j in xrange(1,len(B)+1): if A[i-1] == B[j-1]: res[i][j] = res[i-1][j-1]+1 maxlen = max(res[i][j],maxlen) else: res[i][j] = 0 return maxlen
时间复杂度O(mn),空间复杂度也为O(mn)。和之前的空间复杂度为O(mn)的题目一样,这题的空间复杂度可以优化为O(min(m,n))甚至是O(1)。O(1)解法是按照对角线和对角线的平行线来扫。
posted on 2016-05-26 15:37 Sheryl Wang 阅读(173) 评论(0) 编辑 收藏 举报