File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments