leetcode:6251. 统计回文子序列数目【dp + 统计xy子序列出现的个数】
创始人
2024-02-19 15:50:04
0

目录

  • 题目截图
  • 题目分析
  • ac code
  • 总结

题目截图

在这里插入图片描述

题目分析

  • 固定了中间的数i后
  • 从两边选xy 和 yx
  • 对于x = y的情况,比较简单预处理每个数字出现的index为ids
  • 然后看看两边x各自的个数n1 n2
  • n1和n2必须大于等于2
  • 左边可以选n1 * (n1 - 1) // 2
  • 右边可以选n2 * (n2 - 1) // 2
  • 两边乘起来即可
  • 对于x != y的情况,要预处理前缀xy出现的个数,以及后缀xy出现的个数
  • 这里需要用dp,记录着前面x出现的个数xcnt,如果当前是y,当前累计xy出现个数xycnt += xcnt即可,前缀后缀都类似处理

ac code

class Solution:def countPalindromes(self, s: str) -> int:n = len(s)MOD = 10 ** 9 + 7if n < 5:return 0ans = 0d = defaultdict(list)for i, v in enumerate(s):d[v].append(i)# dp1[i][10 * x + y]:前i个(包括第i个)xy出现的次数dp1 = [[0] * 100 for _ in range(n)]for x in range(10):for y in range(10):xcnt, ycnt = 0, 0xycnt = 0for i in range(n):if s[i] == str(x):xcnt += 1elif s[i] == str(y):xycnt += xcntdp1[i][10 * x + y] = xycnt# dp2[i][10 * x + y]:后i个(包括第i个)yx出现的次数dp2 = [[0] * 100 for _ in range(n)]for x in range(10):for y in range(10):xcnt, ycnt = 0, 0yxcnt = 0for i in range(n - 1, -1, -1):if s[i] == str(x):xcnt += 1elif s[i] == str(y):yxcnt += xcntdp2[i][10 * x + y] = yxcntfor i in range(2, n - 2): #i作为分割点# s[:i] and s[i + 1:]for x in range(10):for y in range(10):# xy + yx是否能出现x, y = str(x), str(y)xs, ys = d[x], d[y]if len(xs) == 0 or len(ys) == 0:continue# print(x, y, i)# print(left_x, right_x)# print(left_y, right_y)if x != y:# [:i] xy出现的个数# [i + 1:] yx出现的个数# 能否预处理xy, yx = dp1[i - 1][10 * int(x) + int(y)], dp2[i + 1][10 * int(x) + int(y)]# print(xy, yx)ans += xy * yxans %= MODelse:idx_x = bisect_left(xs, i)left_x, right_x = xs[:idx_x], xs[idx_x:]if len(left_x) == 0 or len(right_x) == 0:continueif right_x[0] == i:right_x = right_x[1:]if len(left_x) == 0 or len(right_x) == 0:continuenum1 = len(left_x)num2 = len(right_x)if num1 < 2 or num2 < 2:continueelse:c1 = num1 * (num1 - 1) // 2c2 = num2 * (num2 - 1) // 2ans += c1 * c2ans %= MODreturn ans

总结

  • 一开始以为是模板,后面自己慢慢优化出来了
  • 先固定中间无关紧要的
  • 两边必定是xy以及yx
  • xy相同or不相同
  • x和y只有10个取值
  • 预处理前缀和后缀中xy出现的个数即可
  • 本质还是累计x出现的个数即可,动态规划

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...