力扣 题目87- 扰乱字符串
题目
题解
这题真的是 大脑过载了 看完其他人的题解 我只能说666 所以这里不写了 我怕我写了也写不明白
放个链接给大家伙
代码
1 #include<iostream> 2 #include<string> 3 #include<vector> 4 using namespace std; 5 //代码来源 https://leetcode.cn/u/kingwx001/ kingwx001 大佬膜拜 6 class Solution { 7 public: 8 bool isScramble(string s1, string s2) { 9 int n = s1.length(); 10 vector<vector<vector<bool>>> dp(n, vector<vector<bool>>(n, vector<bool>(n))); 11 for (int j = 0; j < n; j++) { 12 //第一次循环预处理,找长度为1的扰乱字符串 13 for (int k = 0; k < n; k++) { 14 if (s1[j] == s2[k]) { 15 dp[j][j][k] = true; 16 } 17 } 18 } 19 for (int i = n - 1; i >= 0; i--) { 20 //第二次循环倒过来找所有的扰乱字符串 21 for (int j = i; j < n; j++) { 22 int length = j - i + 1; 23 for (int k = 0; k < n - length + 1; k++) { 24 for (int l = 0; l < length - 1; l++) { 25 if (dp[i][i + l][k] && dp[i + l + 1][j][k + l + 1] || 26 dp[i][i + l][k + length - l - 1] && dp[i + l + 1][j][k]) { 27 //两种可能,一种是[i,j]中间存在l使[i,l],[l + 1,j]分别是[k,k + l],[k + l + 1,k + length - 1]的扰乱字符串。另一种反过来就行了 28 dp[i][j][k] = true; 29 break; 30 } 31 } 32 } 33 } 34 } 35 return dp[0][n - 1][0]; 36 } 37 }; 38 39 int main() { 40 Solution sol; 41 string s1 = "great"; 42 string s2 = "rgeat"; 43 bool result=sol.isScramble(s1,s2); 44 cout << result << endl; 45 }