Php 优化子串字串比较算法
我试图解决一个挑战,你必须检查所有的字符串子字符串,它们是字谜。基本上,对于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秒。。。下面是我的代码,我将感谢任何建议-如果你只给我指示或伪代码,那就更好了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
$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;
}
}
}
}
?>