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 ...
随机推荐
- python学习-pandas
import pandas as pd # DataForm 二维数据# print(pd.read_excel("datas.xlsx")) # 多行数据 - 加载表单s = p ...
- 【每天一题】LeetCode 0107. 自底向上层遍历二叉树
开源地址:点击该链接 题目描述 * 给定一个二叉树,返回其节点值自底向上的层次遍历. * 即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历 * * 例如: * 给定二叉树 [3,9,20,nul ...
- 利用Python多线程来测试并发漏洞
需求介绍 有时候想看看Web应用在代码或者数据库层有没有加锁,比如在一些支付.兑换类的场景,通过多线程并发访问的测试方式可以得到一个结论. 步骤 1. Burp Suite安装插件 安装一个Copy ...
- Android 中 MessageQueue 的 nativePollOnce
Android SDK 中的事件循环已经是一个老生常谈的问题了, 像 Handler Looper MessageQueue 这几个类也是被大家研究透彻了. 但是再回头看以前自己的分析, 总感觉差点什 ...
- utf8和utf8mb4的区别
一.简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.好在utf8mb4是utf8的超集,除了将编码改为ut ...
- sql server中取交集、差集和并集的语法
这里简单总结下在SQL Server中取交集.差集和并集的语法. 交集:INTERSECT(适用于两个结果集) SELECT ID, NAME FROM YANGGB1 INTERSECT SELEC ...
- swoole简介
swoole是PHP的扩展,又不是一个普通的扩展.普通的扩展只是提供一个库函数.而swoole扩展在运行后会接管PHP的控制权,进入事件循环.当IO事件发生后,swoole会自动回调指定的PHP函数. ...
- 微信小程序-强制手机端更新
小程序的更新机制 开发者在管理后台发布新版本的小程序之后,如果某个用户本地有小程序的历史版本,此时打开的可能还是旧版本.微信客户端会有若干个时机去检查本地缓存的小程序有没有更新版本,如果有则会静默更新 ...
- jquery 常用选择器基础语法学习
siblings方法的常用应用场景:选中高亮 实现代码 <!DOCTYPE html> <html> <head> <meta charset="U ...
- EFCore某张表中获取某几个字段
目录 EFCore某张表中获取某几个字段 1.背景 2.法一:linq 2.1 使用Select方法 2.2 使用ForEach方法 2.3 其他参考代码 3.法二:IQueryble 3.1 参考例 ...