Leetcode——3. 无重复字符的最长子串
难度: 中等
题目
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次,那么对于子串aba
、abab
、ababc
的计算是可以省略的,可以将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. 无重复字符的最长子串的更多相关文章
- Leetcode(三)无重复字符的最长子串
3. 无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...
- 【LeetCode】无重复字符的最长子串【滑动窗口法】
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...
- [LeetCode] 3. 无重复字符的最长子串
题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...
- 【leetcode 3. 无重复字符的最长子串】解题报告
思路:滑动窗口的思想 方法一:滑动窗口 int lengthOfLongestSubstring(string s) { /* 控制一个滑动窗口,窗口内的字符都是不重复的,通过set可以做到判断字符是 ...
- LeetCode 3: 无重复字符的最长子串 Longest Substring Without Repeating Characters
题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. Given a string, find the length of the longest substring withou ...
- 力扣Leetcode 3. 无重复字符的最长子串
无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...
- [LeetCode]3. 无重复字符的最长子串(滑动窗口)
题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...
- [LeetCode]3.无重复字符的最长子串(Java)
原题地址: longest-substring-without-repeating-characters/submissions 题目描述: 示例 1: 输入: s = "pwwkew&qu ...
- LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)
题目描述 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...
随机推荐
- python异步编程
python用asyncio 模块实现异步编程,该模块最大特点就是,只存在一个线程 由于只有一个线程,就不可能多个任务同时运行.asyncio 是"多任务合作"模式(coopera ...
- 使用jQuery的replaceWith()方法要注意的地方
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- JVM系列之三:类装载器子系统
0. JVM架构图 Java虚拟机主要分为五大模块:类装载器子系统.运行时数据区.执行引擎.本地方法接口和垃圾收集模块. 1. 类的加载 虚拟机类装载器子系统:虚拟机把描述类的数据从class文件加载 ...
- TypeError: Dense_net() takes 0 positional arguments but 1 was given
书写孪生网络的时候出现的错误,调用单通道时出现如下错误. 看了别人写的博客大概和类内的初始化还有self之类的有关系,没有弄清楚.将单通道的文件在函数外声明,在函数内统一调用可以解决这个问题
- 第27课 “共享状态”及其管理者(std::future/std::shared_future)
一. “共享状态” (一)“共享状态”对象 1. 用于保存线程函数及其参数.返回值以及新线程状态等信息.该对象通常创建在堆上,由std::async.std::promise和std::package ...
- Swagger简单介绍
一句话介绍 Swagger Swagger是一个接口文档生成工具,同时提供接口测试调用的辅助功能. 关于 Swagger Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原 ...
- 31,Leetcode下一个排列 - C++ 原地算法
题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常 ...
- (算法)LeetCode刷题
LeetCode 56 合并区别 Given [1,3],[2,6],[8,10],[15,18], return [1,6],[8,10],[15,18]. 关键就是a[1]>=b[0] 也就 ...
- POJ 1306 暴力求组合数
Combinations Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11049 Accepted: 5013 Des ...
- ScheduledThreadPoolExecutor周期任务或延时任务线程池
ScheduledThreadPoolExecutor可以代替timer,timer的缺点是一个timer启动一个线程,如果任务数量很多,会创建很多线程,不推荐使用. ScheduledThreadP ...