最长回文子序列(进阶版:统计不同非空回文子序列的个数)
字数 776 2025-11-02 00:38:37

最长回文子序列(进阶版:统计不同非空回文子序列的个数)

题目描述:
给定一个字符串s,你需要统计其中所有不同的非空回文子序列的个数。注意,即使相同的子序列在原字符串中出现多次,也只统计一次。由于结果可能很大,返回对10^9+7取模的结果。

解题过程:

  1. 问题分析:我们需要统计字符串中所有不同的回文子序列,而不是最长的。这要求我们避免重复计数相同的子序列。

  2. 关键思路:使用动态规划,定义dp[i][j]为子串s[i...j]中不同回文子序列的个数。需要考虑如何避免重复计数。

  3. 状态转移:

    • 基础情况:当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]
  4. 避免重复:通过精确定义l和r的位置,确保相同字符构成的回文子序列只被统计一次。

  5. 实现细节:需要预处理每个字符在每個区间内的第一次和最后一次出现位置。

  6. 复杂度分析:时间复杂度O(n²),空间复杂度O(n²)。

这个解法通过精确定位相同字符的边界,确保了每个不同的回文子序列只被统计一次。

最长回文子序列(进阶版:统计不同非空回文子序列的个数) 题目描述: 给定一个字符串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²)。 这个解法通过精确定位相同字符的边界,确保了每个不同的回文子序列只被统计一次。