长度为4的回文子序列的数量

时间:2016-07-24 13:26:47

标签: algorithm palindrome subsequence

如果长度为S的字符串n仅包含小写英文字母,我们将计算长度为4的回文子序列的数量。

回文子序列的总数可以通过O(n^2) DP来计算。但是如何按O(n log n)O(n)的顺序计算长度为4的此类子序列的数量?

示例:" abcdbaadc"有答案4. [指数(1,2,5,6),(1,2,5,7),(3,6,7,9),(4,6,7,8)]

赞赏任何提示或解释。

1 个答案:

答案 0 :(得分:2)

由于长度为4,您可以枚举ABBA格式的所有可能长度为4的字符串,并且对于每个字符串,运行标准算法以查找给定字符串中该特定字符串的子序列数。

复杂度:O(n * 26 * 26),n是字符串的长度。下面是python代码,用于查找另一个字符串中特定字符串的子序列数。

def num_subsequences(seq, sub):
m, n = len(seq)+1, len(sub)+1
table = [[0]*n for i in xrange(m)]
def count(iseq, isub):
    if not isub:
        return 1
    elif not iseq:
        return 0
    return (table[iseq-1][isub] +
           (table[iseq-1][isub-1] if seq[m-iseq-1] == sub[n-isub-1] else 0))
for row in xrange(m):
    for col in xrange(n):
        table[row][col] = count(row, col)
return table[m-1][n-1]