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

Algorithm 长度为4的回文子序列数,algorithm,palindrome,subsequence,Algorithm,Palindrome,Subsequence,给定长度为n且仅包含小写英文字母的字符串S,我们将计算长度为4的回文子序列的数量 回文子序列的总数可以通过O(n^2)DP来计算。但是如何计算长度为4的子序列的数量,顺序是O(n logn)或O(n) 示例:“abcdbaadc”有答案4。[指数(1,2,5,6)、(1,2,5,7)、(3,6,7,9)、(4,6,7,8)] 欢迎提供任何提示或解释。由于长度为4,您可以枚举所有可能的ABBA形式的长度为4的字符串,并且对于每个字符串,运行标准算法以查找给定字符串中该特定字符串的子序列数 复杂度:

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


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

示例:“abcdbaadc”有答案4。[指数(1,2,5,6)、(1,2,5,7)、(3,6,7,9)、(4,6,7,8)]


欢迎提供任何提示或解释。

由于长度为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]

回文子序列的总数也可以用O(n)来计算。看你在分析中做了一些假设。说明它们可能是个好主意。但AABB形式的字符串也是一个4长度的回文,对吗?