前端中等算法-无重复字符的最长子串
时间:2022-07-28
本文章向大家介绍前端中等算法-无重复字符的最长子串,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
无重复字符的最长子串
难度:中等
描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
样例:
- 输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
- 输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
- 输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
- 输入: "dvdf"
输出: 3
解释: 因为无重复字符的最长子串是 "vdf",所以其长度为 3。
- 输入: "asjrgapa"
输出: 6
解释: 因为无重复字符的最长子串是 "sjrgap",所以其长度为 6。
- 输入: "aabaab!bb"
输出: 3
解释: 因为无重复字符的最长子串是 "ab!",所以其长度为 3。
- 输入: "abcb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
- 输入: "asljlj"
输出: 4
解释: 因为无重复字符的最长子串是 "aslj",所以其长度为 4。
- 输入: "qwnfenpglqdq"
输出: 8
解释: 因为无重复字符的最长子串是 "fenpglqd",所以其长度为 8。
思路分析:
关键在于在出现重复字符时,如何更新不重复字符的index
代码模板:
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
}
想
一
想
再
看
答
案
代码:
- 用对象储存字符的位置, 出现重复字符时更新不重复字符的index。
var lengthOfLongestSubstring = function (s) {
let obj = {}; // 用于储存字符出现的位置
let res = 0; // 最大值
let j = 0; // 不重复字符的index
for (let i = 0; i < s.length; i++) {
// 当前值是否在对象中存储过
const value = obj[s[i]]
if (value !== undefined) {
// 更新上一次重复值的index
// value + 1 跳过之前重复的字符
// j: 之前不重复的index 重复字符 需要全部跳过
j = Math.max(value + 1, j)
}
// 每个字符都计算一下最长不重复值 保存最大值
// 不重复最长长度 = 当前index - 上一次重复值的index + index从0开始 长度从1开始
res = Math.max(res, i - j + 1);
// 存/更新 字符串index
obj[s[i]] = i
}
return res;
};
- 从左到右,一个字符一个字符搜索,看是否重复。
var lengthOfLongestSubstring = function (s) {
var i = 0, // 不重复字符的index
res = 0; // 更新无重复字符的长度
for (j = 0; j < s.length; j++) {
// 查找:不重复字符-当前index之间 有没有出现当前字符
let index = s.slice(i, j).indexOf(s[j])
if (index === -1) {
// 更新无重复字符的长度:当前index-不重复字符的index + 长度从1开始算
res = Math.max(res, j - i + 1);
} else {
// 更新i = 不重复字符的index
// 不重复字符的index = 原不重复的字符index + i-j中出现重复字符的index + 跳过该重复字符
i = i + index + 1;
}
}
return res;
};
点个Star支持我一下~
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Requests库快速学习
- 简单易懂的springMVC中的测试类
- 花了一个星期,我终于把RPC框架整明白了!
- PageHelper分页插件
- Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
- 分享一套仿英雄联盟大型多人联机实时对战游戏源码(包含完整服务器和客户端源码)
- 【Flutter 专题】101 何为 Flutter Elements ?
- 10.10面试:SpringMVC中目前学习过的注解及功能?+怎么接受前端传递到后台的数据?
- 【Flutter 专题】102 何为 Flutter RenderObjects ?
- 创建出来的maven项目没有iml文件
- SpringMVC传递参数乱码解决,web.xml中配置编码过滤器
- SpringMVC中传值有些值为null使用@RequestParam(“name“)解决
- 9.30面试:AOP+事务+JDK动态代理与cglib区别+Spring的aop如何切换底层创建代理对象的方式
- R语言实现基因组的可视化
- Linux实用命令大全(附思维导图)