【问题标题】:Optimize substrings anagram compare algorithm优化子串字谜比较算法
【发布时间】:2015-10-25 06:51:42
【问题描述】:

我试图解决一个挑战,您必须检查所有字符串子字符串是否是字谜。条件基本上是 For 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);

编辑:

再次嗨,今天我有一些时间,所以我尝试优化但无法破解...这是我的新代码,但我认为它变得更糟。有什么高级建议吗?

<?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;
            }
    }
        }
}
?>

【问题讨论】:

  • 您是否需要检查所有可能的子字符串与所有其他(相同长度)子字符串?
  • 我修改了代码并添加了一条规则,如果我检查的子字符串与第二个子字符串的长度不同,则中断。如果它们不同,很明显它们不能是字谜,但这并不能解决速度问题。 @Mihai codereview.stackexchange.com 将是解决问题的更好地方,谢谢,我将从现在开始在那里发布此类内容。可以移动吗?
  • 还有其他建议吗?

标签: php algorithm string-comparison anagram


【解决方案1】:

你应该想一个特定字符串的所有字谜都可以满足的另一条规则。例如,关于每个字符的出现次数。

【讨论】:

  • 太好了,非常感谢。我会看看这会给我带来多少时间。
猜你喜欢
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 2011-02-21
  • 1970-01-01
  • 2020-11-30
  • 2013-01-26
  • 1970-01-01
相关资源
最近更新 更多