话不多说,上题(所有刷题题目都来自力扣,感兴趣的同学可以自行去看看哦)
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解如下
function lengthOfLongestSubstring($s)
{
// 遍历该字符串,一旦遇到重复字符,就算出重复字符之前的长度,同时,再以该重复字符为起点,算后面字符串的长度
$len = strlen($s);
// 键值对数组,用来做map
$tempArr = [];
$strLen = 0;
// 最后一个无重复字符的位置
$lastNoRepeatPos = 0;
$biggestLen = 0;
for($i = 0; $i < $len; $i++)
{
$char = substr($s, $i ,1);
if(isset($tempArr[ $char ]))
{
// 判断该字符最后一次出现的位置
if($lastNoRepeatPos < $tempArr[ $char ])
{
$lastNoRepeatPos = $tempArr[ $char ];
}
$biggestLen = max($strLen, $biggestLen);
$strLen = $i - $lastNoRepeatPos;
}else{
$strLen++;
}
$tempArr[ $char ] = $i;
}
return max($biggestLen, $strLen);
}
其实解题过程中,一直被一个疑问困扰,导致花的时间比较长,就是假如字符串为“abbbba”,我怎么去判断两个a之间是否有重复字符呢?后面想通了,在顺序遍历的过程中,我们需要把每个字符的最后出现的位置记录下来,然后当我们遍历遇到重复字符时,从重复字符开始,当成一个新的串去处理,这样想就通了。