龙空技术网

【算法题】2484. 统计回文子序列数目

攻城狮大兵 59

前言:

而今我们对“java字符串回文数”大体比较关心,我们都需要分析一些“java字符串回文数”的相关内容。那么小编在网上汇集了一些对于“java字符串回文数””的相关知识,希望兄弟们能喜欢,看官们一起来学习一下吧!

#头条创作挑战赛#

题目:

给你数字字符串 s ,请你返回 s 中长度为 5 的 回文子序列 数目。由于答案可能很大,请你将答案对 109 + 7 取余 后返回。

提示:

如果一个字符串从前往后和从后往前读相同,那么它是 回文字符串 。

子序列是一个字符串中删除若干个字符后,不改变字符顺序,剩余字符构成的字符串。

示例 1:

输入:s = "103301"

输出:2

解释:

总共有 6 长度为 5 的子序列:"10330" ,"10331" ,"10301" ,"10301" ,"13301" ,"03301" 。

它们中有两个(都是 "10301")是回文的。

示例 2:

输入:s = "0000000"

输出:21

解释:所有 21 个长度为 5 的子序列都是 "00000" ,都是回文的。

示例 3:

输入:s = "9999900000"

输出:2

解释:仅有的两个回文子序列是 "99999" 和 "00000" 。

提示:

1 <= s.length <= 10^4

s 只包含数字字符。

Java代码

class Solution {   private static final long MOD = (long) 1e9 + 7;   public int countPalindromes(String S) {       var s = S.toCharArray();       int[] pre = new int[10], suf = new int[10];       int[][] pre2 = new int[10][10], suf2 = new int[10][10];       for (var i = s.length - 1; i >= 0; --i) {           var d = s[i] - '0';           for (var j = 0; j < 10; ++j)               suf2[d][j] += suf[j];           ++suf[d];       }       var ans = 0L;       for (var d : s) {           d -= '0';           --suf[d];           for (var j = 0; j < 10; ++j)               suf2[d][j] -= suf[j]; // 撤销           for (var j = 0; j < 10; ++j)               for (var k = 0; k < 10; ++k)                   ans += (long) pre2[j][k] * suf2[j][k]; // 枚举所有字符组合           for (var j = 0; j < 10; ++j)               pre2[d][j] += pre[j];           ++pre[d];       }       return (int) (ans % MOD);   }}

标签: #java字符串回文数