类似最长回文子串,稍微变形一下即可

定义 dp[j][i] 为字符串 j到i 的匹配结果

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return bool布尔型
     */
    bool isValidPairing(string s) {
        int n = s.size();
        vector<vector<bool>> dp(n, vector<bool>(n, false));
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                // 当这一片段长度为奇数时,匹配不可能成功
                if ((i - j + 1) % 2 != 0) {
                    dp[j][i] = false;
                    continue;
                }
                // 当片段长度为2时单独判断
                // 当片段长度大于2时,外层的匹配结果还要兼顾内层的结果
                if (i - j == 1 && ((s[i] == 'B' && s[j] == 'A') ||
                                   (s[i] == 'D' && s[j] == 'C'))) {
                    dp[j][i] = true;
                } else {
                    if ((s[i] == 'B' && s[j] == 'A') || (s[i] == 'D' && s[j] == 'C')) {
                        dp[j][i] = dp[j + 1][i - 1];
                    }
                }
            }
        }
        return dp[0][n - 1];
    }
};

时间复杂度:O(n^2),双重循环遍历字符串s

空间复杂度:O(n^2),存储二维数组dp