给你数字字符串 s
,请你返回 s
中长度为 5
的 回文子序列 数目。由于答案可能很大,请你将答案对 10^9 + 7
取余 后返回。
提示:
如果一个字符串从前往后和从后往前读相同,那么它是 回文字符串 。
子序列是一个字符串中删除若干个字符后,不改变字符顺序,剩余字符构成的字符串。
示例 1:
```txt
输入:s = "103301"
输出:2
解释:
总共有 6 长度为 5 的子序列:"10330" ,"10331" ,"10301" ,"10301" ,"13301" ,"03301" 。
它们中有两个(都是 "10301")是回文的。
```
示例 2:
```txt
输入:s = "0000000"
输出:21
解释:所有 21 个长度为 5 的子序列都是 "00000" ,都是回文的。
```
示例 3:
```txt
输入:s = "9999900000"
输出:2
解释:仅有的两个回文子序列是 "99999" 和 "00000" 。
```
提示:
1 <= s.length <= 10^4
s
只包含数字字符。
统计回文子序列数目
题目
给你数字字符串 s
,请你返回 s
中长度为 5
的 回文子序列 数目。由于答案可能很大,请你将答案对 10^9 + 7
取余 后返回。
提示:
- 如果一个字符串从前往后和从后往前读相同,那么它是 回文字符串 。
- 子序列是一个字符串中删除若干个字符后,不改变字符顺序,剩余字符构成的字符串。
示例 1:
1 | 输入:s = "103301" |
示例 2:
1 | 输入:s = "0000000" |
示例 3:
1 | 输入:s = "9999900000" |
提示:
-
1 <= s.length <= 10^4
s
只包含数字字符。
题解
方法一:
思路
两次dp,枚举分割线。
设p[i][j][k]
为前i位以j和k结尾的子序列个数, s[i][j][k]
为后i位以j和k结尾的子序列个数。
这时答案为 $\sum \limits_{i=2}^{n-3} \sum \limits_{j=0}^{9} \sum \limits_{k=0}^{9}p[i-1][j][k]*p[i+1][k][j]$
总时间复杂度$O(|\Sigma|^2n)$,$\Sigma$字符集大小不超过10,$n$为字符串长度
代码
1 | class Solution { |