其他分享
首页 > 其他分享> > 扰乱字符串

扰乱字符串

作者:互联网

扰乱字符串

 

详细思路

枚举长度,具有某种递推关系,枚举长度,对于起点ij,枚举切割长度ck,从切割长度递推长度,长度不同不用判断   精确定义 dp i j k    长度为k,起点为ij 是否为扰乱,dp 0 0 1是第一个字符开始,长度为1 s0 t0 是第一个字符   递推 - - - - - - - -  dpk i j =dp[ck][i][j]&&dp[k-ck][i+ck][j+ck])不用交换的扰乱 ||   dp[ck][i][j+k-ck]&&dp[k-ck][i+ck][j]交换的扰乱   如果已经是true,不用继续枚举ck   初始化 - - - -  - - - - 长度为1时,任意起点的判断 dp[1][i][j]
class Solution {
public:
    bool isScramble(string s1, string s2) {
        if(s1.size()!=s2.size())return false;
        int n=s1.size();
        vector<vector<vector<int>>>dp(n+1,vector<vector<int>>(n,vector<int>(n,0)));
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(s1[i]==s2[j])dp[1][i][j]=1;
            }
        }
        for(int k=2;k<=n;k++){
            for(int i=0;i+k<=n;i++){
                for(int j=0;j+k<=n;j++){
                    for(int ck=1;ck<k;ck++){
                        if(dp[k][i][j])break;
                        dp[k][i][j]=dp[ck][i][j]&&dp[k-ck][i+ck][j+ck]||
                                    dp[ck][i][j+(k-ck)]&&dp[k-ck][i+ck][j];
                    }
                }
            }
        }
        return dp[n][0][0];
    }
};
踩过的坑 枚举长度+起点是最好的,动态规划不要用起点+终点

 

 

标签:ck,扰乱,枚举,起点,字符串,长度,dp
来源: https://www.cnblogs.com/zhouzihong/p/15084110.html