Php 优化子串字串比较算法

Php 优化子串字串比较算法,php,algorithm,string-comparison,anagram,Php,Algorithm,String Comparison,Anagram,我试图解决一个挑战,你必须检查所有的字符串子字符串,它们是字谜。基本上,对于S=abba,无图对是:{S[1,1],S[4,4]},{S[1,2],S[3,4]},{S[2,2],S[3,3]}和{S[1,3],S[2,4]} 问题是我有100个字符的字符串,执行时间应该在9秒以下。我的时间大约是50秒。。。下面是我的代码,我将感谢任何建议-如果你只给我指示或伪代码,那就更好了 $time1 = microtime(true); $string = 'abdcasdabvdvafsgfdsvaf

我试图解决一个挑战,你必须检查所有的字符串子字符串,它们是字谜。基本上,对于S=abba,无图对是:{S[1,1],S[4,4]},{S[1,2],S[3,4]},{S[2,2],S[3,3]}和{S[1,3],S[2,4]}

问题是我有100个字符的字符串,执行时间应该在9秒以下。我的时间大约是50秒。。。下面是我的代码,我将感谢任何建议-如果你只给我指示或伪代码,那就更好了

$time1 = microtime(true);
$string = 'abdcasdabvdvafsgfdsvafdsafewsrgsdcasfsdfgxccafdsgccafsdgsdcascdsfsdfsdgfadasdgsdfawdascsdsasdasgsdfs';
$arr = [];
$len = strlen($string);
for ($i = 0; $i < strlen($string); $i++) {
    if ($i === 0) {
        for ($j = 1; $j <= $len - 1; $j++) {
            $push = substr($string, $i, $j);
            array_push($arr, $push);
        }
    } else {
        for ($j = 1; $j <= $len - $i; $j++) {
            $push = substr($string, $i, $j);
            array_push($arr, $push);
        }
    }
}
$br = 0;
$arrLength = count($arr);
foreach ($arr as $key => $val) {
    if ($key === count($arr) - 1) {
        break;
    }
    for ($k = $key + 1; $k < $arrLength; $k++) {
        if (is_anagram($val, $arr[$k]) === true) {
            $br++;
        }
    }
}
    echo $br."</br>";


function is_anagram($a, $b)
{
    $result = (count_chars($a, 1) == count_chars($b, 1));
    return $result;
}
$time2 = microtime(true);
echo "Script execution time: ".($time2-$time1);
$time1=微时间(真);
$string='abdcasdabvdvafsgfdsvafdsafewsrgsdcasfsdfgxccafdsgcafgsdcascdsfsdfsdgfadasdgsdgfadgsdgfadgsdgfadgsdgsdgsdgfs';
$arr=[];
$len=strlen($string);
对于($i=0;$i
您应该考虑另一个规则,即某个字符串的所有字谜都可以满足。例如,关于每个字符的出现次数。

是否需要检查所有可能的子字符串与所有其他子字符串(相同长度)的比较子字符串?我修改了代码,并添加了一条规则,如果我正在检查的子字符串与第二个子字符串的长度不同,则该规则将被打破。如果它们不同,很明显它们不能是字谜,但这并不能解决速度问题。@Mihai codereview.stackexchange.com将是回答该问题的更好地方,谢谢我将从n发布到那里哦,这样的事情。有可能移动它吗?还有其他建议吗?太好了,非常感谢。我会看看这会给我带来多少时间减少。
<?php

$string = 'abdcasdabvdvafsgfdsvafdsafewsrgsdcasfsdfgxccafdsgccafsdgsdcascdsfsdfsdgfadasdgsdfawdascsdsasdasgsdfs';    
$arr = [];
$len = strlen($string);
for ($i = 0; $i < strlen($string); $i++) {
    if ($i === 0) {
        for ($j = 1; $j <= $len - 1; $j++) {

            $push = substr($string, $i, $j);
            array_push($arr, $push);
        }
    } else {
        for ($j = 1; $j <= $len - $i; $j++) {
            $push = substr($string, $i, $j);
            array_push($arr, $push);
        }
    }
}

$br = 0;
$arrlen = count ($arr);
foreach ($arr as $key => $val) {
    if (($key === $arrlen - 1)) {
        break;
    }

    for ($k = $key + 1; $k < $arrlen; $k++) {

    $result = stringsCompare($val,$arr[$k]);
        if ($result === true)
        {
            $br++;
        }

}

    echo $br."\n";
}

function stringsCompare($a,$b)
{
    $lenOne = strlen($a);
    $lenTwo = strlen ($b);
    if ($lenOne !== $lenTwo)
    {
        return false;
    }
    else {
        $fail = 0;
        if ($lenOne === 1) {
            if ($a === $b) {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
        for ($x = 0; $x < $lenOne; $x++)
        {
         $position = strpos($b,$a[$x]);
             if($position === false)
             {
                 $fail = 1;
                 break;

             }
            else
            {
                $b[$position] = 0;
                $fail = 0;
            }
        }
        if ($fail === 1)
        {
            return false;
        }
            else
            {
                return true;
            }
    }
        }
}
?>