LC5666. 回文串分割 IV(区间dp)

LC5666. 回文串分割 IV(区间dp)

题意

判断字符串能否分解为三段回文子串。


思路

因为 n ≤ 2000 n\le 2000 n≤2000,所以可以 n 2 n^2 n2预处理判断任意区间 [ l , r ] [l,r] [l,r]是否回文串。
然后暴力枚举两个割点即可。

因为回文串是往外扩展的,所以区间 d p dp dp是可行的。


const int N=2e3+5;
bool dp[N][N];
class Solution {
public:
    bool checkPartitioning(string s) {
        memset(dp,false,sizeof dp);
        int n=s.size();
        for(int l=1;l<=n;l++)
            for(int i=0;i+l-1<n;i++){
                int j=i+l-1;
                if(l==1) dp[i][j]=1;
                else if(l==2) dp[i][j]=(s[i]==s[j]);
                else dp[i][j]=(s[i]==s[j]&&dp[i+1][j-1]);
            }
        for(int i=1;i<n;i++)
            for(int j=i;j+1<n;j++)
                if(dp[i][j]&&dp[0][i-1]&&dp[j+1][n-1]) return true;
                return false;
    }
};
上一篇:[NOIP1998 普及组] 阶乘之和


下一篇:国产飞腾2000+存放性能简单验证 SSD 与 HDD