题目链接
3. longest-substring-without-repeating-characters 难度:medium
知识点
1. 滑动窗口法
经典算法,此处不开展
解法
1. 暴力循环
此处不赘述
2. 滑动窗口
用一个数组做滑动窗口,每次 right
向右挪动时候,判断该字符串是否在窗口内存在,若不存在则持续右移,记录以后窗口长度;若存在则将左边界置为窗口中该字符的左边。
class Solution {
/**
* @param String $s
* @return Integer
*/
function lengthOfLongestSubstring($s) {$len = strlen($s);
$left = $right = 0;
$ans = 0;
$queue = [];
while($right < $len){
// 判断是否在
$index = array_search($s[$right], $queue);
$queue[] = $s[$right];
if(false !== $index){$queue = array_slice($queue, $index + 1);
}
$ans = max($ans, count($queue));
$right++;
}
return $ans;
}
}
3. 滑动窗口 2
相比于解法 2,这里其实没有应用数组,而是哈希记录了左右边界,每次 right
向右挪动时候,判断该字符串哈希表里对应的值 (str 索引
) 是否在 left
的左边,若在左边,则left= 该索引 +1
,若不存在则持续右移,记录以后窗口长度;若存在则将左边界置为窗口中该字符的左边。
复杂度剖析
- 工夫复杂度:O(n),其中 n 为字符的长度。咱们要遍历字符全副地位,而解决每个地位,包含哈希查找只须要 O(1)的工夫。
- 空间复杂度:O(n),最大哈希长度。
以下为 PHP 语言实现~~~~
class Solution {
/**
* @param String $s
* @return Integer
*/
function lengthOfLongestSubstring($s) {$len = strlen($s);
$left = $right = 0;
$ans = 0;
$queue = [];
while($right < $len){
// 判断是否在
$index = array_search($s[$right], $queue);
if(false !== $index){$queue = array_slice($queue, $index);
}else{$queue[] = $s[$right];
var_dump($queue);
$ans = max($ans, count($queue));
}
$right++;
}
return $ans;
}
}