《leetCode-php》乱序字符串

题目给出一个字符串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);
发布了284 篇原创文章 · 获赞 32 · 访问量 49万+

猜你喜欢

转载自blog.csdn.net/less_cold/article/details/102453438