📌  相关文章
📜  长度为k的回文子序列数,其中k <= 3(1)

📅  最后修改于: 2023-12-03 14:58:17.139000             🧑  作者: Mango

统计长度为k的回文子序列数

本文将介绍如何统计长度为k的回文子序列数,其中k <= 3。

什么是回文子序列

回文子序列指的是一个序列,将它倒叙排列后得到的新序列与原序列相同,但不要求连续。

例如,在序列 "abcdba" 中,"abcba" 是一个回文子序列。

统计方法

对于长度为k的回文子序列,可以分类讨论。

k=1

长度为1的回文子序列就是序列中的每个元素本身,数量为序列长度。

k=2

长度为2的回文子序列需要满足两个元素相同,数量为每个元素出现次数的平方和。

k=3

长度为3的回文子序列需要满足首尾元素相同,并且中间元素可以是任意元素,数量为每个元素出现次数的立方和。

代码实现
def count_palindromic_subsequence(s):
    counts = {}
    for c in s:
        if c in counts:
            counts[c] += 1
        else:
            counts[c] = 1
    
    count_1 = sum(counts.values())
    count_2 = sum([v**2 for v in counts.values()])
    count_3 = sum([v**3 for v in counts.values()])
    
    return count_1 + count_2 + count_3

此代码中,首先统计了序列中每个元素出现的次数,然后分别计算了长度为1、2、3的回文子序列数量,最后将它们加起来得到总数量。

对于长度超过3的回文子序列,本文不做介绍。