有时候面试会问到的一道题目,字符串最长不重复子串,当然问法可能不一样,给你一串数字,求最长的连续子串,也是同样的逻辑
最长不重复子串
<?php
$string = "cbacmcdaefaeadkqatlmtxtb";
// 获取字符串长度
$len = strlen($string);
// 最长字符串
$maxArr = [];
// 临时最长不重复字符串
$temArr = [];
$index = 0;
while ($index < $len) {
$char = $string[$index];
$index ++;
if (!array_key_exists($char, $temArr)) {
$temArr[$char] = $index;
// 如果不是最后一次循环就继续进入一下次循环
if ($index !== $len) {
continue;
}
}
// 判断当前字符串是否为最长字符串,如果是就替换
if (count($temArr) > count($maxArr)) {
$maxArr = $temArr;
}
// 下次循环开始位置
// 第一次循环不重复cba,当第四次循环c时已经从存在,记录当前最长字符串,下次循环从b开始
$index = $temArr[$char];
// 数组重置为空,准备存储下一个不重复字符串
$temArr = [];
}
// dkqatlm
echo implode('', array_keys($maxArr));
最长连续子串
<?php
$string = "4532123456708808";
// 获取字符串长度
$len = strlen($string);
// 最长字符串
$maxArr = [];
// 临时最长连续字符串
$temArr = [];
$index = 0;
while ($index < $len) {
$char = $string[$index];
$index ++;
if (empty($temArr) || $char == end($temArr)+1) {
$temArr[] = $char;
// 如果不是最后一次循环就继续进入一下次循环
if ($index !== $len) {
continue;
}
} else {
// 不等于则回滚当前值,作为下一次循环开始值
// 第一次得到连续字符串45,第三次循环为3,不连续,所以一下次循环从这个键开始
$index --;
}
if (count($temArr) > count($maxArr)) {
$maxArr = $temArr;
}
// 数组重置为空,准备存储下一个连续字符串
$temArr = [];
}
// 1234567
echo implode('', $maxArr);