问题描述:
从一个字符串中找到一个连续子串,该子串中任何两个字符不能相同,求子串的最大长度并输出一条最长不重复子串。
参考答案:
<?php class longest_not_repeatable_substring { function __construct($str) { $maxlen = 0; $maxindex = 0; /* LNRS 基本算法 hash */ $visit_key = range('a', 'z'); $visit_val = array_fill(0, 26, -1); $visit = array_combine ($visit_key, $visit_val); $visit[$str[0]] = 0; $curlen = 1; $last_start = 0; $size = strlen($str); for($i=1; $i<$size; $i++) { if($visit[$str[$i]] == -1) { $curlen++; $visit[$str[$i]] = $i; /* 记录字符下标 */ } else { if($last_start <= $visit[$str[$i]]) { $curlen = $i - $visit[$str[$i]]; $last_start = $visit[$str[$i]] + 1; $visit[$str[$i]] = $i; /* 更新最近重复位置 */ } else { $curlen++; } } if($curlen > $maxlen) { $maxlen = $curlen; $maxindex = $i + 1 - $maxlen; } } $this->output($str, $maxindex, $maxlen); } /* 输出LNRS */ private function output($str, $maxindex, $maxlen) { if($maxlen == 0) { echo iconv('utf-8', 'gbk', '无最长的不重复子串'); } else { echo iconv('utf-8', 'gbk', '最长的不重复子串的长度为:'.$maxlen."\n其值为:\n"); $i = $maxindex; while($maxlen--) { printf("%s",$str[$i++]); } } printf("\n"); } } function read() { $input = trim(fgets(STDIN)); return $input; } function test() { $str = 'abcdefabcdefg'; new longest_not_repeatable_substring($str); } function main() { echo iconv('utf-8', 'gbk', "请输入字符串\n"); $str = read(); new longest_not_repeatable_substring($str); } if(!empty($argv[1]) && $argv[1]=='test') { test(); } else { main(); }