classSolution:defcountPalindromicSubsequences(self, s:str)->int:# 区间dp求解方案数的问题# 定义dp[i][j] 为原来的序列中,s[i] 到 s[j]中
mod =10**9+7
n =len(s)
dp =[[0]* n for _ inrange(n)]for i inrange(n-1,-1,-1):
dp[i][i]=1# 单个字符是一个回文子序列for j inrange(i+1, n):if s[i]== s[j]:# 找到左右边界,避免重复计数
left = i +1
right = j -1# 找到第一个等于 s[i] 的字符while left <= right and s[left]!= s[i]:
left +=1# 找到第一个等于 s[j] 的字符while left <= right and s[right]!= s[j]:
right -=1if left > right:# 没有重复字符
dp[i][j]= dp[i+1][j-1]*2+2elif left == right:# 只有一个重复字符,那么删除的是单独的nums[i]
dp[i][j]= dp[i+1][j-1]*2+1else:# 有多个重复字符,存在重复计数的过程
dp[i][j]= dp[i+1][j-1]*2- dp[left+1][right-1]else:
dp[i][j]= dp[i+1][j]+ dp[i][j-1]- dp[i+1][j-1]
dp[i][j]%= mod # 取模if dp[i][j]<0:
dp[i][j]+= mod # 确保结果是非负的return dp[0][n-1]