本题解使用动态编程的方法来计算所有长度为5的回文子序列的数量。思路是使用多层哈希结构(数组)来维护字符的各种可能组合及其出现的次数和索引和。主要步骤分为:1) 更新a数组,它维护每个数字字符的出现次数;2) 更新b数组,它维护每种两字符组合的出现次数及索引和;3) 更新d数组,它维护每种四字符组合(形如ABCD)的出现次数;4) 通过对d数组的查询来统计所有可能的回文子序列。由于回文的特性,第五个字符必须与第一个字符相同,因此通过匹配这种模式来累计计数。
时间复杂度: O(n)
空间复杂度: O(1)
class Solution:
def countPalindromes(self, s: str) -> int:
s = list(map(int, s))
a = [0] * 10 # Count of each digit
b = [[[0, 0] for j in range(10)] for i in range(10)] # Count and sum of indexes for pairs
d = [[0 for j in range(10)] for i in range(10)] # Count of quads
ans = 0
M = 10 ** 9 + 7
for i, num in enumerate(s):
# Calculate counts for 5-length palindromes
for y in range(10):
ans = (ans + d[num][y]) % M
# Update quads based on pairs
for x in range(10):
d[x][num] += (i-1) * b[x][num][0] - b[x][num][1]
d[x][num] %= M
# Update pairs based on digit count
for x in range(10):
b[x][num][0] += a[x]
b[x][num][1] += a[x] * i
# Update count of each digit
a[num] += 1
return ans