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