Skip to content

Commit d8c4b7c

Browse files
committed
ok
1 parent 6d328d0 commit d8c4b7c

1 file changed

Lines changed: 62 additions & 0 deletions

File tree

src/com/leetcode/Main87.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.leetcode;
2+
3+
/**
4+
* 87. 扰乱数组
5+
* 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树。
6+
*
7+
* 下图是字符串 s1 = "great" 的一种可能的表示形式。
8+
*
9+
* great
10+
* / \
11+
* gr eat
12+
* / \ / \
13+
* g r e at
14+
* / \
15+
* a t
16+
* 在扰乱这个字符串的过程中,我们可以挑选任何一个非叶节点,然后交换它的两个子节点。
17+
*
18+
* 例如,如果我们挑选非叶节点 "gr" ,交换它的两个子节点,将会产生扰乱字符串 "rgeat" 。
19+
*/
20+
public class Main87 {
21+
public boolean isScramble(String s1, String s2) {
22+
char[] chs1 = s1.toCharArray();
23+
char[] chs2 = s2.toCharArray();
24+
int n = s1.length();
25+
int m = s2.length();
26+
if (n != m) {
27+
return false;
28+
}
29+
boolean[][][] dp = new boolean[n][n][n + 1];
30+
// 初始化单个字符的情况
31+
for (int i = 0; i < n; i++) {
32+
for (int j = 0; j < n; j++) {
33+
dp[i][j][1] = chs1[i] == chs2[j];
34+
}
35+
}
36+
37+
// 枚举区间长度 2~n
38+
for (int len = 2; len <= n; len++) {
39+
// 枚举 S 中的起点位置
40+
for (int i = 0; i <= n - len; i++) {
41+
// 枚举 T 中的起点位置
42+
for (int j = 0; j <= n - len; j++) {
43+
// 枚举划分位置
44+
for (int k = 1; k <= len - 1; k++) {
45+
// 第一种情况:S1 -> T1, S2 -> T2
46+
if (dp[i][j][k] && dp[i + k][j + k][len - k]) {
47+
dp[i][j][len] = true;
48+
break;
49+
}
50+
// 第二种情况:S1 -> T2, S2 -> T1
51+
// S1 起点 i,T2 起点 j + 前面那段长度 len-k ,S2 起点 i + 前面长度k
52+
if (dp[i][j + len - k][k] && dp[i + k][j][len - k]) {
53+
dp[i][j][len] = true;
54+
break;
55+
}
56+
}
57+
}
58+
}
59+
}
60+
return dp[0][0][n];
61+
}
62+
}

0 commit comments

Comments
 (0)