题目给出一个字符串s1,我们可以用递归的方法将字符串分成两个非空的子串来将s1表示成一个二叉树
下面是s1=“coder”的一种二叉树的表现形式:
coder
/ \
co der
/ \ / \
c o d er
/ \
e r
将字符串乱序的方法是:选择任意的非叶子节点,交换它的两个孩子节点。
例如:如果我们选择节点“co”交换他的两个孩子节点,就会产生一个乱序字符串"ocder".
ocder
/ \
oc der
/ \ / \
o c d er
/ \
e r
我们称"ocder"是"coder"的一个乱序字符串。
类似的:如果我们继续交换“der”的两个孩子节点和“at”的两个孩子节点,会产生乱序字符串"ocred"
ocred / \ oc red / \ / \ o c re d / \ r e
我们称"ocred"是"coder"的一个乱序字符串。
给出两个长度相同的字符串s1 和 s2,请判断s2是否是s1的乱序字符串。
思路:就是在所有的节点处分割判断是不是交换的字符串,有两种,一种是两个字符串是前i个是一样的字母变化 和 i到最后的部分都是一样的字母变化,即i内部发生交换或者i之后内部发生了交换;另一种是前i个,后num-1前面i个是一样的,剩下的部分对应一样,即大部分发生了交换。
如果字母不相同压根不需要继续递归查询,如果字符串一样,直接成功,也不需要递归查询。
package main
/**
*
* @param s1 string字符串
* @param s2 string字符串
* @return bool布尔型
*/
func isScramble( s1 string , s2 string ) bool {
// write code here
num1 := len(s1)
num2 := len(s2)
if num1 != num2 {
return false
}
if s1 == s2 {
return true
}
A := make(map[rune]int)
S1 := []rune(s1)
S2 := []rune(s2)
for i := 0; i < num1; i++ {
A[S1[i]]++
A[S2[i]]--
}
for _, item := range A {
if item != 0 {
return false
}
}
for i := 1; i < num1; i++ {
if isScramble(s1[:i], s2[:i]) && isScramble(s1[i:], s2[i:]) {
return true
}
if isScramble(s1[:i], s2[num1-i:]) && isScramble(s1[i:], s2[:num1-i]) {
return true
}
}
return false
}