题目描述

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

示例

示例  1:

输入: "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"

输出: 1

解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是  "wke",所以其长度为 3。

请注意,你的答案必须是 子串 的长度,"pwke"  是一个子序列,不是子串。

分析

我们可以维护一个范围[i, j)的窗口来保存子串,使用 HashSet/HashMap 作为容器,对 s 进行遍历。如果窗口中不包含有 s[j],则将 s[j]添加到窗口中并计数,反之,将 s[i]从窗口中移除。也可以使用一个 int 数组来代替 HashSet。

数组 说明
int [26] 'A'-'Z'和'a'-'z'
int [128] ASCII 码
int [256] ASCII 扩展码

时间复杂度为 O(n),遍历一次 s,n 为 s 的长度;

空间复杂度为 O(min(m,n)),需要额外的 HashSet,取决于 s 的长度 n 和窗口长度 m。

实现

C#

class Solution
{
public int LongestSubstringWithoutRepeating(string s)
{
// 96 ms int[]
// int n = s.Length, ans = 0;
// int[] index = new int[128]; // new int[256];
// for (int j = 0, i = 0; j < n; j++)
// {
// i = Math.Max(index[s[j]], i);
// ans = Math.Max(ans, j - i + 1);
// index[s[j]] = j + 1;
// }
// return ans; // 100 ms HashSet<char>
// int len = s.Length;
// HashSet<char> set = new HashSet<char>();
// int ans = 0, i = 0, j = 0;
// while (i < len && j < len)
// {
// if (!set.Contains(s[j]))
// {
// set.Add(s[j++]);
// ans = Math.Max(ans, j - i);
// }
// else set.Remove(s[i++]);
// }
// return ans; // 100ms Dictionary<char, int>
int n = s.Length, ans = 0;
Dictionary<char, int> dic = new Dictionary<char, int>();
for (int j = 0, i = 0; j < n; j++)
{
if (dic.ContainsKey(s[j]))
{
i = Math.Max(dic[s[j]], i);
dic[s[j]] = j + 1;
}
else dic.Add(s[j], j + 1);
ans = Math.Max(ans, j - i + 1);
}
return ans;
}
}

C++

class Solution {
public:
int lengthOfLongestSubstring(std::string s) {
std::vector<int> dic(256, -1);
int maxlen = 0, start = -1;
int len = s.length();
for (int i = 0; i != len; i++) {
if (dic[s[i]] > start)
start = dic[s[i]];
dic[s[i]] = i;
maxlen = std::max(maxlen, i - start);
}
return maxlen;
}
}

Python

class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
size = len(s)
ans = i = 0
index = [0] * 128
for j in range(0, size):
i = max(index[ord(s[j])], i)
ans = max(ans, j - i + 1)
index[ord(s[j])] = j + 1
return ans

Rust

pub fn length_of_longest_substring(s: String) -> i32 {
let (mut n, mut res) = (s.len(), 0);
// let mut map = HashMap::<u8, i32>::new();
// let mut i = 0;
// let chars = s.as_bytes();
// for j in 0..n {
// if map.contains_key(&chars[j]) {
// i = max(*map.get(&chars[j]).unwrap(), i);
// map.entry(chars[j]).and_modify(|e| *e = j as i32 + 1);
// } else {
// map.insert(chars[j], (j + 1) as i32);
// }
// res = max(res, j as i32 - i + 1);
// } let mut map = vec![0; 128];
let chars = s.as_bytes();
let mut i = 0;
for j in 0..n {
i = max(map[chars[j] as usize], i);
res = max(res, j as i32 - i + 1);
map[chars[j] as usize] = j as i32 + 1;
}
res
}

Typescript

function lengthOfLongestSubstring(s: string): number {
let len: number = s.length,
ans: number = 0;
let index: Array<number> = new Array<number>(128).fill(0);
for (let i = 0, j = 0; j < len; j++) {
i = Math.max(index[s[j].charCodeAt(0)], i);
ans = Math.max(ans, j - i + 1);
index[s[j].charCodeAt(0)] = j + 1;
}
return ans;
}

C

int lengthOfLongestSubstring(char * s){
int len = 0;
char *end = s, *temp;
char *addressTable[128] = {NULL};
while (*end) {
temp = addressTable[*end];
addressTable[*end] = end;
if (temp >= s) {
len = end - s > len ? end - s : len;
s = temp + 1;
}
end++;
}
len = end - s > len ? end - s : len;
return len;
}

LeetCode-03 无重复字符的最长子串(Longest Substring Without Repeating Characters)的更多相关文章

  1. LeetCode 3: 无重复字符的最长子串 Longest Substring Without Repeating Characters

    题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. Given a string, find the length of the longest substring withou ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. KVM导入Ubuntu Cloud 镜像创建虚机及调整磁盘大小

    Ubuntu Cloud Images Ubuntu官网会给各种公有云平台提供cloud镜像, 例如AWS, MS Azure, Google Cloud, 以及本地虚机环境例如 QEMU, VMwa ...

  2. 微光互联 TX800-U 扫码器无法输出中文到光标的问题

    问题背景 某检测场有一批扫码器,购于微光互联,型号 TX800-U,用于在不同办理窗口间扫描纸质材料上的二维码,简化录入过程.扫码器通过 USB 接入 PC 系统 (windows),自动安装驱动,接 ...

  3. windows设置开机启动程序

    1.新建文件,填写路径 @echo off cd F:\程序路径\ //后面填写3D所在的路径 F: //程序的个盘符 run.bat 把这个文件填写完成后,改个名字,后缀改为bat,并把这个文件放在 ...

  4. vlunhub靶场之EMPIRE: LUPINONE

    准备: 攻击机:虚拟机kali.本机win10. 靶机:EMPIRE: LUPINONE,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhub ...

  5. 五、kubernetes节点与令牌管理

    Kubernetes节点与令牌管理 一.令牌管理 查看令牌 [root@master ~]# kubeadm token list 删除令牌 [root@master ~]# kubeadm toke ...

  6. ARM TrustZone白皮书部分阅读

    嵌入式系统安全的一些解决方法及缺陷 外部硬件安全模块:在主SoC之外包含一个专用的硬件安全模块或可信元件,e.g. 手机的SIM卡.隔离仅限于可以从非易失性存储器运行的相对静态程序 内部硬件安全模块: ...

  7. SpringBoot 06: springboot中使用redis

    配置SpringBoot 创建SpringBoot项目时勾选Redis起步依赖 <dependency> <groupId>org.springframework.boot&l ...

  8. Inventor 2021保姆级安装教程

    Inventor 2021 WIN10 64位安装步骤: 1.先使用"百度网盘客户端"下载INT21_CN_x64安装包到电脑磁盘里,并鼠标右击进行解压缩,安装前先断网,然后找到I ...

  9. Go语言核心36讲18

    你很棒,已经学完了关于Go语言数据类型的全部内容.我相信你不但已经知晓了怎样高效地使用Go语言内建的那些数据类型,还明白了怎样正确地创造自己的数据类型. 对于Go语言的编程知识,你确实已经知道了不少了 ...

  10. 自学 TypeScript 第四天,手把手项目搭建

    前言: 学了三天,我们学习了 TS 的基本类型声明,TS 的编译,webpack 打包,其实也就差不多了,剩下的也就一些 类,继承,构造函数,抽象类,泛型一些的,如果都细致的讲可能写好久,感兴趣的可以 ...