LintCode-最长重复子序列-动态规划
2018-11-10 本文已影响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