0
点赞
收藏
分享

微信扫一扫

LeetCode 3.无重复字符的最长子串(中等)

LeetCode 3.无重复字符的最长子串(中等)_最长子串

题目描述

LeetCode 3.无重复字符的最长子串(中等)_窗口大小_02


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

LeetCode 3.无重复字符的最长子串(中等)_最长子串

示例 1

LeetCode 3.无重复字符的最长子串(中等)_窗口大小_02


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

LeetCode 3.无重复字符的最长子串(中等)_最长子串

示例 2

LeetCode 3.无重复字符的最长子串(中等)_窗口大小_02


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

LeetCode 3.无重复字符的最长子串(中等)_最长子串

示例 3

LeetCode 3.无重复字符的最长子串(中等)_窗口大小_02


输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

LeetCode 3.无重复字符的最长子串(中等)_最长子串

提示

LeetCode 3.无重复字符的最长子串(中等)_窗口大小_02


  • 0 <= s.length <= 5 *
  • s 由英文字母、数字、符号和空格组成

LeetCode 3.无重复字符的最长子串(中等)_最长子串

题目分析

LeetCode 3.无重复字符的最长子串(中等)_窗口大小_02


这道题可以使用滑动窗口解决。首先初始化区间指针,并建立一个哈希表,存储字符索引值加一,加一表示从字符索引后一个才开始不重复。窗口区间就是不重复子字符串的区间,我们不断更新窗口大小,当遇到与区间内字符相同的情况,将字符作为 key 获取其 value 更新窗口大小,确保窗口中不存在相同的字符。在遍历的同时更新最长不重复子字符串的长度,最后返回即可。

LeetCode 3.无重复字符的最长子串(中等)_窗口大小_13

LeetCode 3.无重复字符的最长子串(中等)_子串_14

LeetCode 3.无重复字符的最长子串(中等)_窗口大小_15

LeetCode 3.无重复字符的最长子串(中等)_最长子串_16

LeetCode 3.无重复字符的最长子串(中等)_子串_17


LeetCode 3.无重复字符的最长子串(中等)_窗口大小_18

LeetCode 3.无重复字符的最长子串(中等)_最长子串_19

LeetCode 3.无重复字符的最长子串(中等)_最长子串

题解

LeetCode 3.无重复字符的最长子串(中等)_窗口大小_02


执行用时: 4 ms

内存消耗: 41.8 MB

class Solution {
public int lengthOfLongestSubstring(String s) {
// 获取字符串长度
int length = s.length();
// 统计结果
int count = 0;
// 哈希表
HashMap<Character, Integer> map = new HashMap<>();
// 左右指针遍历字符串
for (int left = 0, right = 0; right < length; ++right) {
// 获取右指针指向的字符
char cur = s.charAt(right);
// 哈希表中存在当前字符
if (map.containsKey(cur)) {
// 更新左指针
left = Math.max(map.get(cur), left);
}
// 更新统计结果
count = Math.max(count, right - left + 1);
// 哈希表中不存在当前字符 将字符添加进哈希表
map.put(s.charAt(right), right + 1);
}
return count;
}
}

题目来源:力扣(LeetCode)




举报

相关推荐

0 条评论