优化子串字谜比较算法
Posted
技术标签:
【中文标题】优化子串字谜比较算法【英文标题】: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;
?>
【问题讨论】:
您是否需要检查所有可能的子字符串与所有其他(相同长度)子字符串? codereview.stackexchange.com 我修改了代码并添加了一条规则,如果我检查的子字符串与第二个子字符串的长度不同,则中断。如果它们不同,很明显它们不能是字谜,但这并不能解决速度问题。 @Mihai codereview.stackexchange.com 将是解决问题的更好地方,谢谢,我将从现在开始在那里发布此类内容。可以移动吗? 还有其他建议吗? 【参考方案1】:你应该想一个特定字符串的所有字谜都可以满足的另一条规则。例如,关于每个字符的出现次数。
【讨论】:
太好了,非常感谢。我会看看这会给我带来多少时间。以上是关于优化子串字谜比较算法的主要内容,如果未能解决你的问题,请参考以下文章