美文网首页
LintCode-最长重复子序列-动态规划

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

作者: 想当厨子的程序员 | 来源:发表于2018-11-10 16:33 被阅读0次

    描述

    给出一个字符串,找到最长的重复子序列的长度,并且这两个子序列不能在相同位置有同一元素。
    比如:在两个子序列中的第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-最长重复子序列-动态规划

          本文链接:https://www.haomeiwen.com/subject/qbnzxqtx.html