LintCode-最长重复子序列-动态规划

描述

给出一个字符串,找到最长的重复子序列的长度,并且这两个子序列不能在相同位置有同一元素。
比如:在两个子序列中的第i个元素不能在原来的字符串中有相同的下标。

样例

给出str = abc, 返回 0, 不存在重复子序列

给出str = aab, 返回 1, 两个子序列分别是 a(第一个) 和 a(第二个).
注意 b 不能被认为是子序列的一部分,因为它在两个子序列里面有相同的下标。

给出str = aabb, 返回 2

思路

这是LCS的变种题目!
其意思是求字符串中两个不相交的相等子序列,那么联想一下如何求两个不同字符串序列中的最长公共子序列(对于序列的下标位置没有要求)。就可以看出,这个题目就是求两个相同字符串序列的最长公共子序列,但是有个要求,就是相同字符的下标不能相同,转换一下思路,题目还是很简单的。

代码

class Solution:
    """
    @param str: a string
    @return: the length of the longest repeating subsequence
    """
    def longestRepeatingSubsequence(self, str):
        # write your code here
        n = len(str)
        dp = [[0 for j in range(n+1)] for i in range(n+1)]
        for i in range(1, n+1):
            for j in range(1, n+1):
                if str[i-1] == str[j-1] and i != j:
                    dp[i][j] = dp[i-1][j-1] + 1
                else:
                    dp[i][j] = max(dp[i][j-1], dp[i-1][j])
        return dp[n][n]

题目来源

https://www.lintcode.com/problem/longest-repeating-subsequence/description

你可能感兴趣的:(LintCode-最长重复子序列-动态规划)