/**
* 无重复字符串的最长子串
* @param string $str
* @return string
*/
function LongestSubstringWithoutDuplicateCharacters(string $str): string
{
// 第一步,找出所有无重复子字符串
$len = strlen($str); // 字符串长度
$substring = ''; // 子字符串
$arr = []; // 保存无重复子字符串的容器
for ($i = 0; $i < $len; ++$i) {
$index = strpos($substring, $str[$i]); // 在子字符串中查找字符
// 如果有重复字符,将之保存在容器,并寻找下一个无重复字符串(从重复字符串处截断字符)
if ($index !== false) {
$arr[] = $substring;
$substring = substr($substring, $index + 1) . $str[$i];
} else {
$substring .= $str[$i];
}
}
$arr[] = $substring;
// 第二步,从无重复子字符串中找出最长字符串
$str = ''; // 最长子字符串
$len = 0; // 最长子字符串长度
foreach ($arr as $value) {
$tmp = strlen($value);
if ($tmp > $len) {
$str = $value;
$len = $tmp;
}
}
return $str;
}
$str = 'atabnajk';
echo LongestSubstringWithoutDuplicateCharacters($str);