lengthOfLongestSubstring

本文针对LeetCode上的“无重复字符的最长子串”问题,提供了两种解决方案:一种是初始的暴力解法,时间复杂度为O(n^3);另一种是在参考社区后实现的更高效的O(n)时间复杂度的解法。高效解法利用了哈希表来跟踪字符最后一次出现的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode 链接 : https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/description/  

题目: 无重复字符的最长子串

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

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串"pwke" 是 子序列 而不是子串。

  

第一次做只能实现"暴力"解决,时间复杂度是最糟糕的O(n^3).参考社区提供后,学会了时间复杂度的O(n)的解法.


    class Solution {
    public int lengthOfLongestSubstring(String s) {
        //返回值,最长子字符串
        int result = 0 ; 
        //索引号
        int index = 0 ;
        //记录键值对
        Map<Character , Integer> map = new HashMap();
        //两个相同字符之间的距离
        int mark = 0 ;
        //字符串的长度
        int stringLeng = s.length();
        //遍历字符串
        while(stringLeng != index ) 
        {
            //取出每个字符串的字符
            char c = s.charAt(index) ;
            //字符重复出现
            if( map.containsKey( c )) {
                两个相同字符之间的距离
                mark = Math.max(mark , map.get( c ));
            }
            //最长子字符串, "+1"和下一条语句的"++index"是防止字符串s长度为1的情况.
            maxLength =  Math.max(result , index - mark + 1);
            //放入键值对
            map.put(c , ++index);
        }
        return result ;
    }
}

### lengthOfLongestSubstring 函数的实现分析 `lengthOfLongestSubstring` 是一个经典的算法问题,目标是找到字符中的无重复字符的长度。以下是该函数的一个常见实现[^4]: ```python class Solution: def lengthOfLongestSubstring(self, s: str) -> int: char_index = {} # 存储字符及其索引位置 max_length = 0 # 长子长度 start = 0 # 当前无重复子的起始位置 for i, char in enumerate(s): if char in char_index and char_index[char] >= start: start = char_index[char] + 1 # 更新起始位置 char_index[char] = i # 更新字符的新索引 max_length = max(max_length, i - start + 1) # 更新大长度 return max_length ``` 在上述代码中,`char_index` 字典用于存储字符及其对应的索引位置。通过维护一个滑动窗口(由 `start` 和当前索引 `i` 定义),可以高效地计算长无重复子的长度。 #### 错误原因分析 如果在第 14 行出现错误,可能的原因包括以下几种情况: 1. **输入参数类型错误**:如果传入的参数不是字符类型,可能会导致运行时错误。例如,传入整数或列表等非字符类型将引发异常。 2. **逻辑错误**:如果 `char_index` 的更新逻辑存在问题,可能会导致错误的结果。例如,未正确更新 `start` 或 `max_length`。 3. **边界条件处理不当**:对于空字符或单字符字符,如果没有正确处理边界条件,可能会导致错误结果。 为了进一步排查问题,可以检查以下内容: - 确保输入参数为字符类型。 - 检查 `char_index` 是否正确更新。 - 验证边界条件是否被正确处理。 #### 示例测试用例 以下是一些示例测试用例及其预期输出,可用于验证函数的正确性: ```python solution = Solution() # 测试用例 1 print(solution.lengthOfLongestSubstring("abcabcbb")) # 输出: 3 # 测试用例 2 print(solution.lengthOfLongestSubstring("bbbbb")) # 输出: 1 # 测试用例 3 print(solution.lengthOfLongestSubstring("pwwkew")) # 输出: 3 # 测试用例 4 print(solution.lengthOfLongestSubstring("")) # 输出: 0 ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值