优化子串字谜比较算法

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】:

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

【讨论】:

太好了,非常感谢。我会看看这会给我带来多少时间。

以上是关于优化子串字谜比较算法的主要内容,如果未能解决你的问题,请参考以下文章

获取所有子串(拼字游戏)的字谜的所有单词列表的算法?

PHP中的字谜算法

Java anagram finder 算法

文本比较算法Ⅱ——Needleman/Wunsch算法

查找字符串中的所有字谜如何优化

重复排列 - 非字谜算法