
3种解法 - 计算无重复字符的最长子串
初始化一个数组 遍历字符串中的每个字符 初始化一个数组 遍历字符串中的每个字符 遍历所有子串的起始位置 对于每个起始位置 检查子串 如果有重复字符,终止当前子串的检查。 如果没有重复字符,记录长度
发布日期:2021-05-08 16:54:32
浏览次数:25
分类:精选文章
本文共 2392 字,大约阅读时间需要 7 分钟。
解决方案:找出不含重复字符的最长子串的长度
问题分析
给定一个字符串,找出其中不含有重复字符的最长子串的长度。子串是字符串中连续的一段字符,因此必须是连续的。例如:
- 示例1:"abcabcbb" 的最长子串是 "abc",长度为3。
- 示例2:"bbbbb" 的最长子串是 "b",长度为1。
- 示例3:"pwwkew" 的最长子串是 "wke",长度为3。
解法一:滑动窗口法
思路:使用一个窗口来记录当前的子串,确保窗口内没有重复字符。当遇到重复字符时,调整窗口的起始位置,以确保窗口内字符唯一。记录窗口的最大长度。
步骤:
r
记录每个字符的最后出现位置。c
记录窗口的起始位置。mx
记录最大子串长度。item
: - 如果
item
已经存在于r
且位置大于等于c
,则调整窗口起始位置c
为r[item] + 1
。 - 更新
item
的位置为当前索引i
。 - 计算当前窗口长度,并更新
mx
。
代码示例:
public class Solution { public int LengthOfLongestSubstring(string s) { int[] r = new int[128]; // ASCII码个数 int c = 0, mx = 0; int i = 0; for (char item : s) { if (r[item] >= c) { c = r[item] + 1; } r[item] = i; int currentLength = i - c + 1; if (currentLength > mx) { mx = currentLength; } i++; } return mx; }}
时间复杂度:O(n)空间复杂度:O(1)
解法二:固定数组法
思路:使用一个数组记录每个字符的最后出现位置。对于每个字符,计算当前窗口的起始位置,并更新最大长度。
步骤:
r
记录每个字符的最后出现位置。c
记录窗口的起始位置。mx
记录最大子串长度。item
: - 如果
item
已经存在且位置大于等于c
,则调整窗口起始位置c
为r[item] + 1
。 - 更新
item
的位置为当前索引i
。 - 计算当前窗口长度,并更新
mx
。
代码示例:
public class Solution { public int LengthOfLongestSubstring(string s) { int[] r = new int[128]; int c = 0, mx = 0; int i = 0; for (char item : s) { if (r[item] >= c) { c = r[item] + 1; } r[item] = i; int currentLength = i - c + 1; if (currentLength > mx) { mx = currentLength; } i++; } return mx; }}
时间复杂度:O(n)空间复杂度:O(1)
解法三:暴力法
思路:遍历所有可能的子串,检查每个子串是否包含重复字符,记录最长的子串长度。
步骤:
i
。i
,遍历所有结束位置 j
(从 i+1
到字符串末尾)。s[i..j]
是否有重复字符。j - i + 1
,并更新 mx
。代码示例:
public class Solution { public int LengthOfLongestSubstring(string s) { int mx = 0; for (int i = 0; i < s.Length; i++) { Listr = new ArrayList<>(); for (int j = i + 1; j < s.Length; j++) { if (r.contains(s.charAt(j))) { break; } r.add(s.charAt(j)); if (j - i + 1 > mx) { mx = j - i + 1; } } } return mx; }}
时间复杂度:O(n^3)空间复杂度:O(n)
总结
解法一和解法二都是高效的线性时间算法,适合处理长字符串。解法三虽然正确,但效率较低,仅在字符串较短时适用。建议优先选择解法一或解法二。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月29日 01时33分55秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
500套精美Logo样机模板可直接套用、轻松制作炫酷logo
2023-01-23
centos7上安装 mysql
2023-01-23
5小时内使用DeepSeek写出一篇优质论文的三步攻略指南
2023-01-23
60天新媒体公众号写作秘诀
2023-01-23
C#多线程编程系列(五)- 使用任务并行库
2023-01-23
ASP.NET MVC4 json序列化器
2023-01-23
Android 版本更新之打开apk文件的前生今世
2023-01-23
6410_Linux系统系统移植 和 驱动加载
2023-01-23
64位WIN7+oracle11g+plsql安装
2023-01-23
6天掌握mysql基础视频教程
2023-01-23
7 Tips For Better JDeveloper Experience
2023-01-23
70. 爬楼梯
2023-01-23
7B2 PRO主题5.4.2免授权直接安装
2023-01-23
7大常用JCL 模板
2023-01-23
111
2023-01-23
80个Python经典资料(教程+源码+工具)汇总——下载目录
2023-01-23
80个Python经典资料(教程+源码+工具)汇总——下载目录
2023-01-23
8个微信实用技巧,你知道多少?
2023-01-23
8点FFT的C语言实现
2023-01-23
950个织梦网dede模板源码
2023-01-23