力扣 题目87- 扰乱字符串

题目


题解


 

这题真的是 大脑过载了 看完其他人的题解 我只能说666 所以这里不写了 我怕我写了也写不明白

放个链接给大家伙

https://leetcode.cn/problems/scramble-string/solution/miao-dong-de-qu-jian-xing-dpsi-lu-by-sha-yu-la-jia/

代码

 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 }
View Code

 

posted @ 2022-07-10 16:43  无聊的阿库娅  阅读(14)  评论(0编辑  收藏  举报