当前位置: 首页 > news >正文

3. 无重复字符的最长子串

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

示例 1:
输入: 
s = "abcabcbb"
输出: 

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

解题思路:

  1. 初始化变量:使用一个哈希表(或数组)来记录每个字符最近出现的位置。定义两个指针,left 和 right,分别表示当前窗口的左右边界。初始时,left 和 right 都指向字符串的开始。

  2. 滑动窗口:移动 right 指针,扩展窗口的右边界。对于每一个新字符,检查它是否已经在当前窗口中出现过(即其最近出现位置是否在 left 的右侧)。

  3. 调整左边界:如果字符已经在窗口中存在,则将 left 指针移动到该字符上次出现位置的下一个位置,以确保窗口内没有重复字符。

  4. 更新最大长度:在每次移动 right 指针后,计算当前窗口的长度(right - left + 1),并更新最大长度记录。

// 函数:计算字符串中不含重复字符的最长子串的长度
int lengthOfLongestSubstring(char * s) {
    int n = strlen(s); // 获取字符串的长度
    if (n == 0) return 0; // 如果字符串为空,直接返回0
    
    int lastIndex[256]; // 创建一个数组,用于记录每个字符最后出现的位置,ASCII字符共有256个
    memset(lastIndex, -1, sizeof(lastIndex)); // 初始化数组,将所有位置设为-1,表示字符未出现过
    
    int maxLen = 0; // 用于记录最长子串的长度
    int left = 0; // 滑动窗口的左边界
    
    for (int right = 0; right < n; right++) { // 遍历字符串,right是滑动窗口的右边界
        char currentChar = s[right]; // 当前字符
        if (lastIndex[currentChar] >= left) { // 如果当前字符在窗口内已经出现过
            left = lastIndex[currentChar] + 1; // 移动左边界到该字符上次出现位置的下一位
        }
        lastIndex[currentChar] = right; // 更新当前字符的最后出现位置
        int currentLen = right - left + 1; // 计算当前窗口的长度
        if (currentLen > maxLen) { // 如果当前窗口长度大于已知的最大长度
            maxLen = currentLen; // 更新最大长度
        }
    }
    
    return maxLen; // 返回最长子串的长度
}

实验小结:

        本次实验通过实现滑动窗口算法,解决了寻找字符串中不含重复字符的最长子串长度的问题。实验过程中,首先明确了滑动窗口的基本思想,即通过动态调整窗口的左右边界来确保窗口内字符的唯一性。具体实现时,利用哈希表记录字符的最后出现位置,从而高效地判断重复字符并调整窗口边界。通过测试用例验证,算法能够正确处理不同场景,如连续重复字符、无重复字符等情况,确保了结果的准确性和高效性。实验加深了对滑动窗口技术的理解,并掌握了如何利用哈希表优化字符串处理问题。最终,算法的时间复杂度为O(n),空间复杂度为O(1)(固定大小的字符集),满足高效处理的要求。

http://www.dtcms.com/a/97081.html

相关文章:

  • DeepSeek-V3新版本DeepSeek-V3-0324
  • Android 中隐藏标题栏和状态栏的方法
  • QCW模式:准连续波驱动在VCSEL激光器中的技术解析与应用价值
  • Transformer MHA KV-Cache技术小结(MHA,GQA,MQA,MLA)
  • 计算机三级网络技术大题总结
  • 3、网工软考—Vlan配置—基于端口的静态划分
  • 搭建前端环境和后端环境
  • 详解Nginx 配置:从入门到精通
  • 一文详解k8s体系架构知识
  • 软考-高项,知识点一览十二 质量管理
  • 大数据点燃智能电商:从“数据厨房”烹出智慧购物新体验
  • Makerbase SimpleFOCShield V3.2 第二课 闭环测试
  • AI知识补全(七):AI Agent 智能代理是什么?
  • Java加载 Grovy 类实现类的自动切换
  • Linux中断处理流程
  • jdk21使用Vosk实现语音文字转换,免费的语音识别
  • RL基础以及AlphaGo、AlphaGo Zero原理
  • 英伟达GPU SKU设计核心策略
  • 【log4j】配置Slf4j
  • 机器学习——GBDT、GBRT
  • Vue下 Sortable 实现 table 列表字段可拖拽排序,显示隐藏组件开发
  • 食品计算—Nutrition5k: Towards Automatic Nutritional Understanding of Generic Food
  • 5、类的6个默认成员函数和特性--类的新功能
  • 高级java每日一道面试题-2025年3月14日-微服务篇[Eureka篇]-Eureka如何保证高可用性?
  • freecad手动装插件 add on
  • 最大数字(java)(DFS实现)
  • AMD机密计算虚拟机介绍
  • ubuntu系统安装docker
  • 天梯赛 L2-022 重排链表
  • 自顶向下学习K8S--部署Agones