题目描述

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

示例

示例  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. 什么是Scrum?Scrum的核心要点和精髓

    有点长,期望你能通过本文彻底了解 Scrum. 上一篇文章<研发效能组织能力建设之特性团队FeatureTeam(上)>,我们介绍了一个非常有意思且高效的组织模式-特性团队.我们首先介绍了 ...

  2. JSP中实现留言页面的编写并将留言信息展示出来

    1.JavaBean类,实现java代码和html的部分分离,提高代码的复用 package com.wgh; public class MessageBean { private String au ...

  3. 字符串匹配(BF算法和KMP算法及改进KMP算法)

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include<cstring> ...

  4. .Net core--创建一个单元测试xUnit

    创建一个xUnit项目  webApi.test 创建之后会有一个默认的[Fact]  (测试的标准格式) [Fact] public void TestEqual() { int a = 10, b ...

  5. Unity——第一人称控制器的实现

    Unity--第一人称控制器的实现 一.功能描述 在一个场景中实现人物的前后左右移动和跳跃功能:其中前后左右移动通过W.A.S.D方向键实现,跳跃功能通过空格键实现,并且考虑到重力作用,来调节跳跃功能 ...

  6. 获取不同机型微信小程序状态栏+导航栏高度

    获取不同机型微信小程序状态栏+导航栏高度 一. 前言 很多时候我们开发微信小程序,都需要先知道状态栏和导航栏的高度,才能去做其他功能 二. 获取微信小程序状态栏高度 用wx.getSystemInfo ...

  7. kubelet忽然不可用

    原因,有可能机器的cpu信息有变化(扩容或者缩容)解决办法: 删掉/opt/var/lib/kubelet目录下(或者/data/lib/kubelet)cpu_manager_state文件 然后m ...

  8. 基于PCIe的多路视频采集与显示子系统

    基于PCIe的多路视频采集与显示子系统 1        概述 视频采集与显示子系统可以实时采集多路视频信号,并存储到视频采集队列中,借助高效的硬实时视频帧出入队列管理和PCIe C2H DMA引擎, ...

  9. mybatis-自定义映射resultMap

    自定义映射resultMap resultMap处理字段和属性的映射关系 resultMap:设置自定义映射 属性: id:表示自定义映射的唯一标识,不能重复 type:查询的数据要映射的实体类的类型 ...

  10. 记录因Sharding Jdbc批量操作引发的一次fullGC

    周五晚上告警群突然收到了一条告警消息,点开一看,应用 fullGC 了. 于是赶紧联系运维下载堆内存快照,进行分析. 内存分析 使用 MemoryAnalyzer 打开堆文件 mat 下载地址:htt ...