Leetcode+无重复字符的最长子串 小安晋升分享(第三题哦)

本文介绍LeetCode上的一道经典算法题——寻找给定字符串中无重复字符的最长子串长度。通过示例解析,介绍了暴力法的思路与实现,并分析了其时间复杂度为O(n^3)和空间复杂度为O(min(n,m))。

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

无重复字符的最长子串

今天是小安开始Leetcode刷题的第三题,正文开始ing?

题目描述

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

示例
【示例1】

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

【示例2】

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

【示例3】

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

方法2:暴力法

思想

【思路】
逐个检查所有的子字符串,看它是否不含有重复的字符。

代码实现

【JAVA实现】

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        int ans = 0;
        for (int i = 0; i < n; i++)
            for (int j = i + 1; j <= n; j++)
                if (allUnique(s, i, j)) ans = Math.max(ans, j - i);
        return ans;
    }

    public boolean allUnique(String s, int start, int end) {
        Set<Character> set = new HashSet<>();
        for (int i = start; i < end; i++) {
            Character ch = s.charAt(i);
            if (set.contains(ch)) return false;
            set.add(ch);
        }
        return true;
    }
}

复杂度分析

  • 时间复杂度: O ( n 3 ) O(n^3) O(n3),要验证索引范围在 [i, j)内的字符是否都是唯一的,我们需要检查该范围中的所有字符。 因此,它将花费 O ( j − i ) O(j−i) O(ji) 的时间。对于给定的 i,对于所有 j ∈ [ i + 1 , n ] j∈[i+1,n] j[i+1,n] 所耗费的时间总和为: ∑ i + 1 n O ( j − i ) \sum_{i+1}^{n}O(j - i) i+1nO(ji)
    因此,执行所有步骤耗去的时间总和为:因此,执行所有步骤耗去的时间总和为:

O ( ∑ i = 0 n − 1 ( ∑ j = i + 1 n ( j − i ) ) ) = O ( ∑ i = 0 n − 1 ( 1 + n − i ) ( n − i ) 2 ) = O ( n 3 ) O\left(\sum_{i = 0}^{n - 1}\left(\sum_{j = i + 1}^{n}(j - i)\right)\right) = O\left(\sum_{i = 0}^{n - 1}\frac{(1 + n - i)(n - i)}{2}\right) = O(n^3) O(i=0n1(j=i+1n(ji)))=O(i=0n12(1+ni)(ni))=O(n3)

  • 空间复杂度: O ( m i n ( n , m ) ) O(min(n,m)) O(min(n,m)),我们需要 O(k)的空间来检查子字符串中是否有重复字符,其中 k 表示 Set 的大小。而 Set 的大小取决于字符串 n 的大小以及字符集/字母 m 的大小。

Thanks

一起加油哦~~
附待后续揭秘的算法

int lengthOfLongestSubstring(char* s) {
    char*p = s;
    int i= 0,j = 0,len =0;
    for(j=0;*(p+j)!='\0';j++){
        for(i=0;i<j;i++){
            if(*(p+i)==*(p+j)){
                p=p+i+1;
                if(j>len) len=j;
                j=0;
        break;
            }
        }
    }
    len = (j>len)?j:len;
    return len;
}
### LeetCode '无重复字符长子' 的 Python 实现 此问的目标是从给定字符中找到包含任何重复字符长子长度。以下是基于滑动窗口算法的一种高效解决方案。 #### 方法概述 通过维护一个动态窗口来跟踪当前无重复字符的子范围,可以有效地解决该问。具体来说,利用哈希表记录每个字符近一次出现的位置,并调整窗口左边界以排除重复项。 #### 代码实现 以下是一个标准的 Python 解决方案: ```python def lengthOfLongestSubstring(s: str) -> int: char_index_map = {} # 存储字符及其新索引位置 max_length = 0 # 记录大子长度 start = 0 # 当前窗口起始位置 for i, char in enumerate(s): # 遍历字符 if char in char_index_map and char_index_map[char] >= start: # 如果发现重复字符,则更新窗口起点 start = char_index_map[char] + 1 char_index_map[char] = i # 更新或新增字符对应的索引 current_length = i - start + 1 # 当前窗口大小 max_length = max(max_length, current_length) # 更新大长度 return max_length ``` 上述代码的核心逻辑在于使用 `char_index_map` 来存储已访问过的字符以及它们后出现的位置[^1]。当遇到重复字符时,重新计算窗口的起始点并继续扩展窗口直到遍历结束[^2]。 对于输入 `"abcabcbb"`,执行过程如下: - 初始状态:`start=0`, `max_length=0` - 处理到第3个字符 `'c'` 之前未检测到重复,此时 `max_length=3` - 发现有重复字符 `'a'` 后移动窗口左侧至新位置,终返回结果为 `3`. 同样地,在处理像 `"bbbbb"` 这样的极端情况时也能正确得出答案为 `1`[^4]. #### 时间复杂度与空间复杂度分析 时间复杂度 O(n),其中 n 是字符长度;因为每个字符多被访问两次——加入和移除窗口各一次。 空间复杂度 O(min(m,n)) ,m 表示 ASCII 字符集大小 (通常固定为128), 而 n 取决于实际输入字符长度[^5]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值