当前位置:首页 C++ > 正文

c++求回文子序列个数

作者:野牛程序员:2023-12-04 17:39:14 C++阅读 2865

回文子序列的个数可以通过动态规划来计算。以下是一个C++示例代码,用于计算给定字符串中回文子序列的个数:

#include <iostream>
#include <cstring>

int countPalindromicSubsequences(const std::string& str) {
    int n = str.length();
    
    // dp[i][j]表示从i到j的子串中回文子序列的个数
    int dp[n][n];
    memset(dp, 0, sizeof(dp));

    // 每个单字符都是长度为1的回文子序列
    for (int i = 0; i < n; i++) {
        dp[i][i] = 1;
    }

    // 遍历长度为2到n的子串
    for (int len = 2; len <= n; len++) {
        for (int i = 0; i <= n - len; i++) {
            int j = i + len - 1;

            // 如果首尾字符相同,可以在原有的回文子序列基础上新增2个,再加上新的两个单字符
            if (str[i] == str[j]) {
                dp[i][j] = dp[i + 1][j - 1] + 2;
            } else {
                // 如果首尾字符不同,分别计算去掉首字符和去掉尾字符后的子串中的回文子序列个数
                dp[i][j] = dp[i + 1][j] + dp[i][j - 1] - dp[i + 1][j - 1];
            }

            // 处理重复计算的情况
            if (str[i] == str[j]) {
                int k = i + 1;
                int m = j - 1;
                while (k <= m && str[i] == str[k]) {
                    k++;
                }
                while (k <= m && str[j] == str[m]) {
                    m--;
                }
                if (k <= m) {
                    dp[i][j] += 1; // 加上重复的回文子序列个数
                }
            }
        }
    }

    return dp[0][n - 1];
}

int main() {
    std::string input;
    std::cout << "请输入字符串: ";
    std::cin >> input;

    int result = countPalindromicSubsequences(input);

    std::cout << "回文子序列的个数是: " << result << std::endl;

    return 0;
}

这段代码使用动态规划来计算给定字符串中回文子序列的个数。在 countPalindromicSubsequences 函数中,dp[i][j] 表示从索引 ij 的子串中回文子序列的个数。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击