题目:

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

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的更多相关文章

  1. [Swift]LeetCode3. 无重复字符的最长子串 | Longest Substring Without Repeating Characters

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

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

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

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

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

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

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

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

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

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

    难度: 中等 题目 Given a string, find the length of the longest substring without repeating characters. 给定一 ...

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

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

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

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

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

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

随机推荐

  1. CentOS7安装部署squid服务(透明代理+反向代理)

    一.squid服务介绍 Squid是一个高性能的代理缓存服务器,Squid支持FTP.gopher.HTTPS和HTTP协议.和一般的代理缓存软件不同,Squid用一个单独的.非模块化的.I/O驱动的 ...

  2. flash插件

    偶尔见到别人的博客侧边栏 有一些很有意思的flash插件,也想加入到自己博客里面,这里来大概讲一下~ 一.支持js代码 首先要在  博客设置 >开启博客侧边栏公告的js代码支持,提交审核后 很快 ...

  3. PAT1057 Stack(树状数组+倍增)

    目录 题目大意 题目分析 题目大意 要求维护一个栈,提供压栈.弹栈以及求栈内中位数的操作(当栈内元素\(n\)为偶数时,只是求第\(n/2\)个元素而非中间两数的平均值).最多操作100000次,压栈 ...

  4. 深入探索Java设计模式之构建器模式(五)

    抽丝剥茧 细说架构那些事——[优锐课] 简单的程序不需要大量的设计过程,因为它们只关注有限的解决方案,仅使用几个类.大型程序专注于广泛的设计,该设计比好的设计范例的任何其他属性都更能利用可重用性.宏伟 ...

  5. 中国剩余定理(CRT)及其拓展(ExCRT)

    中国剩余定理 CRT 推导 给定\(n\)个同余方程 \[ \left\{ \begin{aligned} x &\equiv a_1 \pmod{m_1} \\ x &\equiv ...

  6. CSS类的操作

    CSS类的操作 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  7. Scrum Meeting - 第七周【Alpha阶段】

    每日任务内容: 本次会议为第七次Scrum Meeting会议 本次会议项目经理召开时间为20:00,在北区男生宿舍楼召开,召开时长约10分钟,探讨了本周选课网站编写的后续工作. 小组成员 本周任务 ...

  8. Gitlab + Jenkins 的 CI 实践

    0x00 事件 为了开发人员更高效的更新应用而采取的 CI 方式实践. 0x01 过程记录 1.Jenkins 设置 安装插件 Gitlab Hook Plugin Build Authorizati ...

  9. java基础练习题

    1变量.运算符和类型转换:1.1手动输入一个学生的成绩,对这个成绩进行一次加分,加当前成绩的20%,输出加分后成绩 Scanner scan = new Scanner(System.in); Sys ...

  10. MySQL基础-存储过程

    存储过程 定义:将一批为了完成特定功能的SQL语句集,根据传入的参数(也可没有),调用,完成单个sql语句更复杂的功能 存储过程思想很简单,就是SQL语句层面上的代码封装和重用 优点:1) 可封装,并 ...