题目内容
描述
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。
给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。
给定 “pwwkew” ,最长子串是 “wke” ,长度是3。
function findMaxLenSub(string $str) {
//用于模拟滑动窗口
//temp中存储的是(字符=>位置)的键值对
$temp = array();
$len = strlen($str);
//备选子串开始位置
$start = 0;
//备选子串长度
$len_temp = 0;
//最大子串开始位置
$maxStart = 0;
//最大子串长度
$maxLen = 0;
for ($i = 0; $i < $len; $i++) {
//i处的字符
$chr = $str[$i];
//如果字符在temp数组中,且其在temp数组中记录的位置大于等于备选子串的开始位置,
//说明有备选子串中有相同字符,需要重新生成备选子串。
if (array_key_exists($chr, $temp) && $temp[$chr] >= $start) {
//备选子串的开始位置为重复字符的下一个位置
$start = $temp[$chr] + 1;
//备选子串的初始长度为两个相同字符
$len_temp = $i - $temp[$chr];
} else {
$len_temp++;
if ($len_temp > $maxLen) {
//备选子串长度如果大于maxLen,备选子串就转正了。
$maxLen = $len_temp;
$maxStart = $start;
}
}
$temp[$chr] = $i;
}
return $maxLen;
}
以 “pwwkew” 字串为例