【发布时间】: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