题目描述

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

示例

示例  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. SpringBoot 自定义注解 实现多数据源

    SpringBoot自定义注解实现多数据源 前置学习 需要了解 注解.Aop.SpringBoot整合Mybatis的使用. 数据准备 基础项目代码:https://gitee.com/J_look/ ...

  2. vulnhub靶场之EMPIRE

    准备: 攻击机:虚拟机kali.本机win10. 靶机:EMPIRE: BREAKOUT,地址我这里设置的桥接,下载地址:https://download.vulnhub.com/empire/02- ...

  3. Resilience4J通过yml设置circuitBreaker

    介绍 Resilience4j是一个轻量级.易于使用的容错库,其灵感来自Netflix Hystrix,但专为Java 8和函数式编程设计. springcloud2020升级以后Hystrix被官方 ...

  4. LcdToos如何实现PX01自动调Flicker及VCOM烧录

    准备工作: LcdTools+PX01点亮需调Flicker的屏:F118 Flicker探头,用于自动Flicker校准测量,F118连接PX01上电后,探头屏会提示零点校准,此时需盖住探头窗口再按 ...

  5. Charles基本功能

    Windows: 运行安装应用程序以在程序菜单中安装 Charles. Mac OS X: 通过双击解压缩下载文件,然后将 Charles 应用程序复制到 Applications 目录中. Linu ...

  6. MongoDB数据库新手入门

    windows安装mongodb 5.0.2 官网下载msi文件 自定义安装到 d:/apptoools/mongodb/ 不要勾选mongodb compass 报错:verify that you ...

  7. HMM算法python实现

    基础介绍,后5项为基础5元素 Q = ['q0', 'q1', 'q2', 'q3'] # 状态集合 States,共 N 种状态 V = ['v0', 'v1'] # 观测集合 Observatio ...

  8. Java-数组工具类Arrays

    java.util.Arrays是一个与数组相关的工具类,里面提供了大量静态方法,用来实现数组常见的操作. toSting方法 public static String toString(数组):将参 ...

  9. vcenter异常死机无法重启

    esxi主机异常掉电重启后,vcenter启动失败 查阅相关资料发现,一般是由于时间同步异常造成, 推荐方法是先确认bios硬件时间已同步,再删除旧的本地服务json文件,重启vcenter的服务. ...

  10. <三>使用类模板实现STL Vector

    使用类模板实现STL Vector,点击查看代码 #include <iostream> using namespace std; template<typename T> c ...