题目链接
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=max(该索引+1, left)
,若不存在则继续右移,记录当前窗口长度;若存在则将左边界置为窗口中该字符的右边。
复杂度分析
- 时间复杂度:O(n),其中 n 为字符的长度。我们要遍历字符全部位置,而处理每个位置,包括哈希查找只需要 O(1)的时间。
- 空间复杂度:O(n),最大哈希长度。
以下为PHP语言实现~~~~
class Solution {
/**
* @param String $s
* @return Integer
*/
function lengthOfLongestSubstring($s) {
$len = strlen($s);
$left = $right = 0;
$hash = [];
$ans = 0;
while($right < $len){
//先判断是否有了
if (isset($hash[$s[$right]])) {
$left = max($hash[$s[$right]] + 1, $left);
}
$hash[$s[$right]] = $right;
$ans = max($ans, $right - $left + 1);
$right++;
}
return $ans;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。