【second】Scramble String
三维DP。
重复子问题->DP
bool isScramble(string s1, string s2) { // Note: The Solution object is instantiated only once and is reused by each test case. if(s1.size()!=s2.size()) return false; if(s1.empty()) return true; int n = s1.size(); vector<vector<vector<bool>>> dp(n,vector<vector<bool>>(n,vector<bool>(n,false))); int i,j,k,len; for(i=0;i<n;i++) for(j=0;j<n;j++) dp[i][j][0] = (s1[i]==s2[j]?true:false); for(len=1;len<n;len++) { for(i=0;i<=n-len-1;i++) { for(j=0;j<=n-len-1;j++) { if(s1.substr(i,len+1)==s2.substr(j,len+1)) dp[i][j][len] = true; else { for(k=1;k<len+1;k++) { if((dp[i][j][k-1]&&dp[i+k][j+k][len-k])||(dp[i][j+len-k+1][k-1]&&dp[i+k][j][len-k])) { dp[i][j][len] = true; break; } } } } } } return dp[0][0][n-1]; }