温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用LeetCode怎么实现无重复字符的最长子串

发布时间:2021-08-05 16:17:55 来源:亿速云 阅读:395 作者:Leah 栏目:编程语言
# 使用LeetCode怎么实现无重复字符的最长子串 ## 目录 1. [问题描述](#问题描述) 2. [解题思路分析](#解题思路分析) - [暴力解法](#暴力解法) - [滑动窗口优化](#滑动窗口优化) - [哈希表加速](#哈希表加速) 3. [代码实现](#代码实现) - [Python版本](#python版本) - [Java版本](#java版本) - [C++版本](#c版本) 4. [复杂度分析](#复杂度分析) 5. [边界条件与测试案例](#边界条件与测试案例) 6. [实际应用场景](#实际应用场景) 7. [总结与扩展](#总结与扩展) --- ## 问题描述 给定一个字符串 `s`,找出其中不含有重复字符的**最长子串**的长度。例如: 

输入: s = “abcabcbb” 输出: 3 解释: 无重复字符的最长子串是 “abc”,长度为 3。

 --- ## 解题思路分析 ### 暴力解法 直接枚举所有可能的子串,检查是否包含重复字符: ```python def lengthOfLongestSubstring(s: str) -> int: n = len(s) max_len = 0 for i in range(n): seen = set() for j in range(i, n): if s[j] in seen: break seen.add(s[j]) max_len = max(max_len, j - i + 1) return max_len 

时间复杂度:O(n²),效率较低。

滑动窗口优化

维护一个窗口 [left, right],通过移动右边界扩展窗口,遇到重复字符时收缩左边界:

def lengthOfLongestSubstring(s: str) -> int: left = max_len = 0 char_index = {} # 存储字符最近出现的位置 for right, char in enumerate(s): if char in char_index and char_index[char] >= left: left = char_index[char] + 1 # 移动左边界 char_index[char] = right max_len = max(max_len, right - left + 1) return max_len 

核心逻辑:通过哈希表记录字符位置,实现O(1)时间判断重复。

哈希表加速

直接使用哈希集合存储窗口内字符:

def lengthOfLongestSubstring(s: str) -> int: seen = set() left = max_len = 0 for right in range(len(s)): while s[right] in seen: seen.remove(s[left]) left += 1 seen.add(s[right]) max_len = max(max_len, right - left + 1) return max_len 

代码实现

Python版本

def lengthOfLongestSubstring(s: str) -> int: char_map = {} left = max_len = 0 for right, char in enumerate(s): if char in char_map and char_map[char] >= left: left = char_map[char] + 1 char_map[char] = right max_len = max(max_len, right - left + 1) return max_len 

Java版本

import java.util.HashMap; class Solution { public int lengthOfLongestSubstring(String s) { HashMap<Character, Integer> map = new HashMap<>(); int left = 0, maxLen = 0; for (int right = 0; right < s.length(); right++) { char c = s.charAt(right); if (map.containsKey(c) && map.get(c) >= left) { left = map.get(c) + 1; } map.put(c, right); maxLen = Math.max(maxLen, right - left + 1); } return maxLen; } } 

C++版本

#include <unordered_map> #include <algorithm> class Solution { public: int lengthOfLongestSubstring(string s) { unordered_map<char, int> charMap; int left = 0, maxLen = 0; for (int right = 0; right < s.size(); right++) { char c = s[right]; if (charMap.count(c) && charMap[c] >= left) { left = charMap[c] + 1; } charMap[c] = right; maxLen = max(maxLen, right - left + 1); } return maxLen; } }; 

复杂度分析

  • 时间复杂度:O(n),每个字符最多被访问两次(滑动窗口左右边界各一次)。
  • 空间复杂度:O(min(m, n)),其中m为字符集大小(ASCII码为128)。

边界条件与测试案例

测试案例 预期输出 说明
"" 0 空字符串
"bbbbb" 1 全部重复字符
"pwwkew" 3 最长子串为"wke"
"abcabcbb" 3 经典案例
" " 1 空格字符

实际应用场景

  1. DNA序列分析:寻找无重复碱基的子序列。
  2. 输入法预测:检测用户输入中的最长无重复词组。
  3. 网络安全:检测恶意代码中的唯一特征字符串。

总结与扩展

提示:在面试中,建议先阐述暴力解法,再逐步优化到滑动窗口方案。 “`

注:实际文章约2600字,此处为精简框架。完整版需扩展每部分的详细解释、图示(如滑动窗口动态过程)、更多语言实现(如Go/Rust)及数学证明(如时间复杂度推导)。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI