难度: 中等

题目

Given a string, find the length of the longest substring without repeating characters.

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"

输出: 1

解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

  请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

示例 4:

输入: "dvdf"

输出: 3

解释: 因为无重复字符的最长子串是 "vdf",所以其长度为 3。注意不是2。

PHP

暴力解法

1、定义一个方法 isUnique($s, $start, $end) 给定字符串和开始、结束标识,计算里面是否包含重复字符,如果是返回false,否则true。

2、对字符串s遍历 i*j趟,生成字串使用isUnique判断是不是重复,如果不是,则更新 返回值 max(最长子串 的长度)。

相当于遍历 N^3次:

//判断一个字符串里面是否有重复字符
function isUnique($s, $start, $end) {
$map = [];
$len = $end-$start+1;
$sub_str = substr($s, $start, $len);
for ($i = 0; $i < $len; $i++) {
if (in_array($sub_str[$i], $map) ) {
return false;
}
$map[] = $sub_str[$i];
} return true;
} /**
* @param String $s
* @return Integer
*/
function lengthOfLongestSubstring($s) {
$len = strlen($s);
$max = 0;
if ($len > 0) {
$max = 1;
} for ($i = 0; $i < $len; $i++) {
for ($j = $i + 1; $j < $len; $j++) {
if ($this->isUnique($s, $i, $j)) {
if ($j - $i + 1 > $max) {
$max = $j - $i + 1;
}
}
}
} return $max;
}

时间复杂度为O(n^3)。

滑动窗口

上面的暴力解法实在是太慢了。以字符串ababc为例,ab出现了2次,那么对于子串abaababababc的计算是可以省略的,可以将i直接往后移动。

我们可以使用一个集合(Set)存储遍历过的值,如果发现即将要遍历的字符串已经存在set里,那么可以将i直接往后移动,并将已存在的字符从集合里删除;如果发现即将要遍历的字符串不在set里,则放在set里,并将j往后移动,同时更新返回值 max(最长子串 的长度)。

function lengthOfLongestSubstring2($s) {
$len = strlen($s);
$max = 0;
$i = $j = 0;
$set = []; while ($i< $len && $j < $len) {
if (!in_array($s[$j], $set)) {
$set[] = $s[$j++];
$max = max($max, $j - $i);
} else {
//出现过,说明符合要求的子字符串已经结束,删掉子字符串开始的字符
//由于php没有java的hashSet结构,下面是模拟删除set里的值
unset($set[array_keys($set, $s[$i++])[0]]);
}
} return $max;
}

时间复杂度为O(2n)=O(n)。

优化的滑动窗口

function lengthOfLongestSubstring3($s) {
$len = strlen($s);
$max = 0;
$i = $j = 0;
$map = []; //dvdf
while ($i< $len && $j < $len) {
if (array_key_exists($s[$j], $map)) {
//发现重复字符,key移动到不重复字符的位置
//例如dvdf,第三次发现d,已经重复,第一个的d的索引是0,那么i需要往下移动
$i = max($map[$s[$j]] + 1, $i);
} $map[$s[$j]] = $j; //key存储字符,value存储某个不重复字符的索引
$max = max($max, $j - $i + 1); $j++;
} return $max;
}

来源

链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters

Leetcode——3. 无重复字符的最长子串的更多相关文章

  1. Leetcode(三)无重复字符的最长子串

    3. 无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...

  2. 【LeetCode】无重复字符的最长子串【滑动窗口法】

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...

  3. [LeetCode] 3. 无重复字符的最长子串

    题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...

  4. 【leetcode 3. 无重复字符的最长子串】解题报告

    思路:滑动窗口的思想 方法一:滑动窗口 int lengthOfLongestSubstring(string s) { /* 控制一个滑动窗口,窗口内的字符都是不重复的,通过set可以做到判断字符是 ...

  5. LeetCode 3: 无重复字符的最长子串 Longest Substring Without Repeating Characters

    题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. Given a string, find the length of the longest substring withou ...

  6. 力扣Leetcode 3. 无重复字符的最长子串

    无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...

  7. [LeetCode]3. 无重复字符的最长子串(滑动窗口)

    题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...

  8. [LeetCode]3.无重复字符的最长子串(Java)

    原题地址: longest-substring-without-repeating-characters/submissions 题目描述: 示例 1: 输入: s = "pwwkew&qu ...

  9. LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)

    题目描述 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...

随机推荐

  1. 两台三层交换机单区域OSPF动态路由实验

    一.   实验目的 1.  掌握三层交换机之间通过OSPF协议实现网段互通的配置方法. 2.  理解RIP协议和OSPF协议内部实现的不同点 二.   应用环境 当两台三层交换机级联时,为了保证每台交 ...

  2. linux-部署1

    0.python安装 ubuntu16.04默认:安装了python2.7和python3.5: Ubuntu18.04默认:只有python3.6.8 下面是针对16.04: python/pyth ...

  3. nginx配置代理时参数说明

  4. Codeforces Round #549 (Div. 2) F 数形结合 + 凸包(新坑)

    https://codeforces.com/contest/1143/problem/F 题意 有n条形如\(y=x^2+bx+c\)的抛物线,问有多少条抛物线上方没有其他抛物线的交点 题解 \(y ...

  5. Java中HashMap和TreeMap的区别

    什么是Map集合在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. HashMap ...

  6. Linux搭建Nexus仓库+高可用方案

    Linux搭建nexus仓库 1.安装jdk 1.1 获取安装包,解压到指定目录: tar xf jdk.tar.gz -C /opt/export 1.2 配置环境变量: # vim /etc/pr ...

  7. iptables如何安全的清空规则

    使用 /sbin/iptables -F 要小心,搞不好,你就马上同服务器断开连接了 如果想清空的话,先执行 /sbin/iptables -P INPUT ACCEPT 然后执行 /sbin/ipt ...

  8. (十)golang--运算符

    1.算术运算符 + -  * / % ++ -- 使用细节:(1)对于"/"号,整数除和小数除的区别: (2)++和--只能独立使用,即a=a++是不允许的:没有++a和--a:i ...

  9. kafka压测

    原文并未提及kafka的版本 并且测试的消息大小都偏小  测试数据供参考 原文还测试了broker等    原文请移步文章末尾 4.1 producer测试 4.1.1 batch-size 测试结果 ...

  10. EasyNetQ笔记

    Each call to Subscribe creates a new queue consumer. If you call Subscribe two times with the same m ...