-
Notifications
You must be signed in to change notification settings - Fork 180
Expand file tree
/
Copy pathq087_ScrambeString.java
More file actions
80 lines (74 loc) · 2.39 KB
/
q087_ScrambeString.java
File metadata and controls
80 lines (74 loc) · 2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package leetcode_algorithm;
/**
* Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.
* <p>
* Below is one possible representation of s1 = "great":
* <p>
* great
* / \
* gr eat
* / \ / \
* g r e at
* / \
* a t
* To scramble the string, we may choose any non-leaf node and swap its two children.
* <p>
* For example, if we choose the node "gr" and swap its two children, it produces a scrambled string "rgeat".
* <p>
* rgeat
* / \
* rg eat
* / \ / \
* r g e at
* / \
* a t
* We say that "rgeat" is a scrambled string of "great".
* <p>
* Similarly, if we continue to swap the children of nodes "eat" and "at", it produces a scrambled string "rgtae".
* <p>
* rgtae
* / \
* rg tae
* / \ / \
* r g ta e
* / \
* t a
* We say that "rgtae" is a scrambled string of "great".
* <p>
* Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.
*/
public class q087_ScrambeString {
public static void main(String[] args) {
q087_ScrambeString solution = new q087_ScrambeString();
System.out.println(solution.isScramble("great", "rgeat"));
System.out.println(solution.isScramble("great", "agret"));
}
/**
* 解法1 递归法
*
* @param s1
* @param s2
* @return
*/
public boolean isScramble(String s1, String s2) {
if (s1 == null || s2 == null) return false;
if (s1.length() != s2.length()) return false;
if (s1.equals(s2)) return true;
int[] letters = new int[26];
for (int i = 0; i < s1.length(); i++) {
letters[s1.charAt(i) - 'a']++;
letters[s2.charAt(i) - 'a']--;
}
//判断s1和s2内所含的字符是否相同
for (int i = 0; i < 26; i++) if (letters[i] != 0) return false;
for (int i = 1; i < s1.length(); i++) {
//s1的左子树和s2的左子树相比,s1的右子树和s2的右子树相比
if (isScramble(s1.substring(0, i), s2.substring(0, i))
&& isScramble(s1.substring(i), s2.substring(i))) return true;
//s1的左子树和s2的右子树相比,s1的右子树和s2的左子树相比
if (isScramble(s1.substring(0, i), s2.substring(s2.length() - i))
&& isScramble(s1.substring(i), s2.substring(0, s2.length() - i))) return true;
}
return false;
}
}