要求:
给定一个字符串,求出其最长的重复子串,如字符串 abcdabcabcd,求得最长重复子串为 abcd 。
参考答案:

<?php
class longest_repeatable_substring
{
    function __construct($str)
    {
        $str_len = strlen($str);
        $maxlen = 0;
        $maxi = 0;
        $suffix_array = array();
        for($i=0; $i<$str_len; $i++)
        {
            $suffix_array[] = substr($str, $i);
        }
        sort($suffix_array);
        for($i=0; $i<$str_len-1; $i++)
        {
            $j = 0;
            while(!empty($suffix_array[$i]{$j}) && ($suffix_array[$i]{$j} == $suffix_array[$i+1]{$j}))
            {
                $j++;
            }
            if($j > $maxlen)
            {
                $maxlen = $j;
                $maxi = $i;
            }
        }
        if($maxlen > 0)
        {
            echo iconv('utf-8', 'gbk', $str.'的最长的重复子串为: '.substr($suffix_array[$maxi], 0 ,$maxlen));
        }
        else
        {
            echo iconv('utf-8', 'gbk', '无最长的重复子串');
        }    
        echo "\n";
    }
}

function read()
{
    $input = trim(fgets(STDIN));
    return $input;
}

function test()
{
    $str = 'abcdefhabcedfjjcdefhijk';
    new longest_repeatable_substring($str);
}

function main()
{
    echo iconv('utf-8', 'gbk', "请输入字符串\n");
    $str = read();
    new longest_repeatable_substring($str);    
}

if(!empty($argv[1]) && $argv[1]=='test')
{
    test();    
}
else
{
    main();
}