LeetCode 3: 无重复字符的最长子串 Longest Substring Without Repeating Characters
题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
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" 是一个子序列,不是子串。
解题思路:
暴力求解, 时间复杂度为 O(n^3), 因为要对所有字符遍历, 对子串遍历确认是否有重复字符, pass
滑动窗口, 维护一个索引
[i,j)
的滑动窗口, 对已存在的字符i'
直接更新滑动窗口[i',j)
, 你需要保留每一个字符值及其索引, 即由字符映射索引位置- 哈希映射: Key 为字符值, Value 为索引位置
- 字符映射: ASCII 码共 128 个字符, 维护一个长度为 128 的整型数组,数组索引值映射 128 个字符,存储元素值为字符位置
哈希映射:
Java:
class Solution {
public int lengthOfLongestSubstring(String s) {
char[] chars = s.toCharArray();//转为字符数组
if (chars.length == 0) return 0;
HashMap<Character, Integer> map = new HashMap<>();//建立哈希映射
int size = s.length(), count = 0, i = 0;
for (int j = 0; j < size; j++) {//遍历字符
if (map.containsKey(chars[j]))//如果映射中存在该字符
i = Math.max(map.get(chars[j]), i);//更新滑动窗口的左边界 i
count = Math.max(count, j - i);//更新 count 为最大值
map.put(chars[j], j + 1);//更新映射中该字符映射的 Value 值为当前位置加一
}
return count + 1;//返回最大累加总数, 需要加 1
}
}
Python:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:
return 0
hash_map = dict() # 建立字典
size = len(s)
i, count = 0, 0
for j, c in enumerate(s): # 枚举字符
if c in hash_map: # 如果映射中存在该字符
i = max(i, hash_map[c]) # 更新滑动窗口的左边界 i
count = max(count, j-i) # 更新 count 为最大值
hash_map[c] = j+1 # 更新映射中该字符映射的 Value 值为当前位置加一
return count+1 # 返回最大累加总数, 需要加 1
字符映射:
Java:
class Solution {
public int lengthOfLongestSubstring(String s) {
char[] chars = s.toCharArray();
if (chars.length == 0) return 0;
int[] index = new int[128];//建立长度为 128 位的 ASCII 码字符映射表
int size = s.length(), count = 0, i = 0;
for (int j = 0; j < size; j++) {//遍历字符
i = Math.max(index[chars[j]], i);//更新滑动窗口的左边界 i
count = Math.max(count, j - i);//更新 count 为最大值
index[chars[j]] = j + 1;//更新映射中该字符所在元素值为当前位置加一
}
return count + 1;//返回最大累加总数, 需要加 1
}
}
Python:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:
return 0
size = len(s)
i, count = 0, 0
index = [0]*128 # 建立长度为 128 位的 ASCII 码字符映射表
for j, c in enumerate(s): # 枚举字符
i = max(i, index[ord(c)]) # 更新滑动窗口的左边界 i
count = max(count, j-i) # 更新 count 为最大值
index[ord(c)] = j+1 # 更新映射中该字符所在元素值为当前位置加一
return count+1 # 返回最大累加总数, 需要加 1
因为 Python 没有字符概念, 需要 ord()
函数转为 ASCII 数字
欢迎关注微.信公..众.号: 爱写Bug
LeetCode 3: 无重复字符的最长子串 Longest Substring Without Repeating Characters的更多相关文章
- [Swift]LeetCode3. 无重复字符的最长子串 | Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...
- 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. 无重复字符的最长子串
难度: 中等 题目 Given a string, find the length of the longest substring without repeating characters. 给定一 ...
- 力扣Leetcode 3. 无重复字符的最长子串
无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...
- [LeetCode]3. 无重复字符的最长子串(滑动窗口)
题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...
- [LeetCode]3.无重复字符的最长子串(Java)
原题地址: longest-substring-without-repeating-characters/submissions 题目描述: 示例 1: 输入: s = "pwwkew&qu ...
随机推荐
- docker-数据管理的备份与恢复
一.数据备份 备份示例如下: 要求:备份nfs数据卷里的data目录里的test-nfs.txt文件到宿主机/data/backup目录下 语法:docker run --volumes -f ...
- webpack前端简单配置
每次用webpack创建项目时,总是要安装一堆包,还要配置一系列文件解析规则,webpack打包规则等,烦不胜烦.网上找的很多webpack配置里面很多里面的配置或者引入包都是被弃用的,因此自己总结了 ...
- Mybatis中的 >= <= 与 sql写法区别
- 简单介绍托管执行和 CLI
目录 CIL 和 ILDASM 查看 myApp.dll 的 CIL 输出 使用 ILSpy 查看 myApp.dll 反编译后的代码 处理器不能直接解释程序集.程序集用的是另一种语言,即公共中间语言 ...
- vue-practice
vue-完整代码 这是一个完整的vue案例,但是接口似乎都失效了,单是代码本身还是很有参考价值的呦!~ 里面包含了:vue,vue-router,....,还是直接看json文件吧 { "n ...
- 错题本:ConstraintLayout 不能正常显示
理想效果: 实际效果: 原因:因为文件中一个控件的约束属性写错了 这个属性是 app:layout_constraintLeft_toLeftOf="@id/oa_setting_group ...
- Ubuntu18.04搭建测试环境
前言 说一下我的情况,之前由于我的云服务器数据库的root账号密码123456太简单,而在之前的博客中也泄露出了我的云服务器的IP地址,导致有人远程连接我的数据库,删除了项目数据库里的数据只剩下WAR ...
- C语言笔记 04_运算符
运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C 语言内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 算术运算符 ...
- FineUICore基础版部署到docker实战
FineUI用了好多年,最近出了FineUICore版本,一直没时间是试一下docker,前几天买了一个腾讯云服务器,1核2g,装了centos7.6,开始的时候主要是整个个人博客,在腾讯云安装了宝塔 ...
- C# -- Quartz.Net入门案例
1. 入门案例 using Quartz;using Quartz.Impl; public class PrintTime : IJob { public Task Execute(IJobExec ...