扰乱字符串

 

详细思路

枚举长度,具有某种递推关系,枚举长度,对于起点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];
    }
};
踩过的坑
枚举长度+起点是最好的,动态规划不要用起点+终点

 

 

posted on 2021-07-31 13:55  offer快到碗里来~  阅读(46)  评论(0)    收藏  举报