LeetCode-Scramble String-乱序字符串-动态规划
https://oj.leetcode.com/problems/scramble-string/
这道题要想办法将其考虑为动态规划,否则会超时。
需要想到的一点是长度比较小的连续子串可以作为长度比较长的连续子串是否是合法乱序的子问题。然后就能定义出递推:
f(p,q,l) :从s1的p和s2的q字符开始的长度为l的子串是否为合法乱序。
分解成的子问题是枚举所有左右子树的长度。也即f(p,q,k) & f(p+k,q+k,l-k)和f(p,q+l-k,k) && f(p+k,q,l-k)这两种。
如此递推即可得到答案。
const int MAX_N =100; class Solution { public: int n,m; bool isScramble(string s1, string s2) { n=s1.length(); if (n!=s2.length()) return false; int dp[MAX_N+1][MAX_N+1][MAX_N+1]; memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) for(int j=0;j<n;j++) { dp[i][j][1]=(s1[i]==s2[j]); } for (int l=2;l<=n;l++) { for(int i=0;i+l<=n;i++) for(int j=0;j+l<=n;j++){ for(int k=1;k<l;k++) { dp[i][j][l]|=dp[i][j][k] & dp[i+k][j+k][l-k]; dp[i][j][l]|=dp[i][j+l-k][k] & dp[i+k][j][l-k]; } } } return dp[0][0][n]; } };