最长回文子序列(进阶版:统计不同非空回文子序列的个数)
字数 776 2025-11-02 00:38:37
最长回文子序列(进阶版:统计不同非空回文子序列的个数)
题目描述:
给定一个字符串s,你需要统计其中所有不同的非空回文子序列的个数。注意,即使相同的子序列在原字符串中出现多次,也只统计一次。由于结果可能很大,返回对10^9+7取模的结果。
解题过程:
-
问题分析:我们需要统计字符串中所有不同的回文子序列,而不是最长的。这要求我们避免重复计数相同的子序列。
-
关键思路:使用动态规划,定义dp[i][j]为子串s[i...j]中不同回文子序列的个数。需要考虑如何避免重复计数。
-
状态转移:
- 基础情况:当i > j时,dp[i][j] = 0;当i == j时,dp[i][j] = 1(单个字符)
- 对于一般情况i < j:
a. 如果s[i] != s[j]:dp[i][j] = dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1]
b. 如果s[i] == s[j]:
需要找到左右边界内的第一个和最后一个与s[i]相同的位置l和r- 如果l > r:说明中间没有相同字符,dp[i][j] = 2×dp[i+1][j-1] + 2
- 如果l == r:说明中间有一个相同字符,dp[i][j] = 2×dp[i+1][j-1] + 1
- 如果l < r:说明中间有多个相同字符,dp[i][j] = 2×dp[i+1][j-1] - dp[l+1][r-1]
-
避免重复:通过精确定义l和r的位置,确保相同字符构成的回文子序列只被统计一次。
-
实现细节:需要预处理每个字符在每個区间内的第一次和最后一次出现位置。
-
复杂度分析:时间复杂度O(n²),空间复杂度O(n²)。
这个解法通过精确定位相同字符的边界,确保了每个不同的回文子序列只被统计一次。