最長繰返しサブストリングアルゴリズム
要求:文字列を指定し、その最長の繰返しサブ列、例えば文字列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 "
";
}
}
function read()
{
$input = trim(fgets(STDIN));
return $input;
}
function test()
{
$str = 'abcdefhabcedfjjcdefhijk';
new longest_repeatable_substring($str);
}
function main()
{
echo iconv('utf-8', 'gbk', "
");
$str = read();
new longest_repeatable_substring($str);
}
if(!empty($argv[1]) && $argv[1]=='test')
{
test();
}
else
{
main();
}