题目给出一个字符串s1,我们可以用递归的方法将字符串分成两个非空的子串来将s1表示成一个二叉树
下面是s1=“great”的一种二叉树的表现形式:
great↵ / ↵ gr eat↵ / / ↵g r e at↵ / ↵ a t
将字符串乱序的方法是:选择任意的非叶子节点,交换它的两个孩子节点。
例如:如果我们选择节点“gr”交换他的两个孩子节点,就会产生一个乱序字符串"rgeat".
rgeat↵ / ↵ rg eat↵ / / ↵r g e at↵ / ↵ a t
我们称"rgeat"是"great"的一个乱序字符串。
类似的:如果我们继续交换“eat”的两个孩子节点和“at”的两个孩子节点,会产生乱序字符串"rgtae".
rgtae↵ / ↵ rg tae↵ / / ↵r g ta e↵ / ↵ t a
我们称"rgtae"是"great"的一个乱序字符串。
给出两个长度相同的字符串s1 和 s2,请判断s2是否是s1的乱序字符串。
<?php
function isScramble($s1, $s2) {
if ($s1 === $s2) {
return true;
}
//判断长度是否相同
$lengS1 = strlen($s1);
$lengS2 = strlen($s2);
if ($lengS1 != $lengS2) {
return false;
}
//判断字符是否完全一致
$arrCodeNum = array();
for ($i = 0; $i < $lengS1; $i ++) {
$arrCodeNum[$s1[$i]] ++;
}
for ($j = 0; $j < $lengS2; $j ++) {
$arrCodeNum[$s2[$j]] --;
}
foreach ($arrCodeNum as $key => $val) {
if ($val != 0) {
return false;
}
}
//判断是否是乱序字符串
for ($i = 1; $i < $lengS1; $i ++) {
//加入剪切的位置在第i处
$s1SubStr1 = substr($s1, 0, $i);
$s1SubStr2 = substr($s1, $i, $lengS1 - $i);
$s2SubStr1 = substr($s2, 0, $i);
$s2SubStr2 = substr($s2, $i, $lengS1 - $i);
if (isScramble($s1SubStr1, $s2SubStr1) && isScramble($s1SubStr2, $s2SubStr2)) {
return true;
}
//反向剪切位置
$s2SubStr1 = substr($s2, 0, $lengS1 - $i);
$s2SubStr2 = substr($s2, $lengS1 - $i, $i);
if (isScramble($s1SubStr1, $s2SubStr2) && isScramble($s1SubStr2, $s2SubStr1)) {
return true;
}
}
//如果都不满足返回空
return false;
}
$s1 = 'great';
$s2 = 'rgeat';
$s2 = 'rgtae';
$s2 = 'raetgr';
$s1 = 'abcd';
$s2 = 'bdac';
$ret = isScramble($s1, $s2);
print intval($ret);