news 2026/5/1 6:47:44

算法题 较大分组的位置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法题 较大分组的位置

830. 较大分组的位置

问题描述

在一个由小写字母组成的字符串s中,如果某一组连续字符的长度大于或等于3,则称其为较大分组

返回每一个较大分组的起始和结束位置(索引从 0 开始)。结果按起始位置升序排列。

示例

输入:s="abbxxxxzzy"输出:[[3,6]]解释:"xxxx"是一个较大分组,起始位置3,结束位置6
输入:s="abc"输出:[]解释:没有长度≥3的连续字符组。
输入:s="abcdddeeeeaabbbcd"输出:[[3,5],[6,9],[12,14]]解释:"ddd""eeee""bbb"都是较大分组。
输入:s="aba"输出:[]

算法思路

双指针

  1. 核心思想

    • 使用两个指针标记当前连续字符组的起始和结束位置
    • 遍历字符串,当字符发生变化时,检查当前组的长度
  2. 边界处理

    • 空字符串或单字符:直接返回空列表
    • 整个字符串都是同一字符:检查总长度是否 ≥ 3

代码实现

importjava.util.*;classSolution{/** * 找出字符串中所有较大分组(连续相同字符长度≥3)的位置 * * @param s 输入字符串(仅包含小写字母) * @return 较大分组的起始和结束位置列表,按起始位置升序排列 */publicList<List<Integer>>largeGroupPositions(Strings){List<List<Integer>>result=newArrayList<>();// 边界情况:字符串长度小于3,不可能有较大分组if(s==null||s.length()<3){returnresult;}intn=s.length();intstart=0;// 当前连续字符组的起始位置// 从索引1开始遍历,比较当前字符与前一个字符for(inti=1;i<n;i++){// 当字符发生变化时,处理前一个字符组if(s.charAt(i)!=s.charAt(i-1)){// 计算当前组的长度intlength=i-start;// 如果长度≥3,添加到结果中if(length>=3){List<Integer>group=Arrays.asList(start,i-1);result.add(group);}// 更新起始位置为当前字符的位置start=i;}}// 处理最后一个字符组(字符串末尾的情况)// 最后一个组的长度为 n - startif(n-start>=3){List<Integer>group=Arrays.asList(start,n-1);result.add(group);}returnresult;}}

算法分析

  • 时间复杂度:O(n)
    • 只需要遍历字符串一次
    • 每个字符只被访问一次
  • 空间复杂度:O(1)(不计算输出空间)
    • 除了存储结果外,只使用常数额外空间

算法过程

输入:s = "abcdddeeeeaabbbcd"

  1. 初始化start = 0
  2. i = 1'b' != 'a',组长度 = 1-0 = 1 < 3,start = 1
  3. i = 2'c' != 'b',组长度 = 2-1 = 1 < 3,start = 2
  4. i = 3'd' != 'c',组长度 = 3-2 = 1 < 3,start = 3
  5. i = 4'd' == 'd',继续
  6. i = 5'd' == 'd',继续
  7. i = 6'e' != 'd',组长度 = 6-3 = 3 ≥ 3,添加[3,5]start = 6
  8. i = 7,8,9:连续'e',继续
  9. i = 10'a' != 'e',组长度 = 10-6 = 4 ≥ 3,添加[6,9]start = 10
  10. i = 11'a' == 'a',继续
  11. i = 12'b' != 'a',组长度 = 12-10 = 2 < 3,start = 12
  12. i = 13,14:连续'b',继续
  13. i = 15'c' != 'b',组长度 = 15-12 = 3 ≥ 3,添加[12,14]start = 15
  14. i = 16'd' != 'c',组长度 = 16-15 = 1 < 3,start = 16
  15. 循环结束:处理末尾,组长度 = 17-16 = 1 < 3

结果:

[[3,5],[6,9],[12,14]]

测试用例

publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:标准示例Strings1="abbxxxxzzy";System.out.println("Test 1: "+solution.largeGroupPositions(s1));// [[3,6]]// 测试用例2:无较大分组Strings2="abc";System.out.println("Test 2: "+solution.largeGroupPositions(s2));// []// 测试用例3:多个较大分组Strings3="abcdddeeeeaabbbcd";System.out.println("Test 3: "+solution.largeGroupPositions(s3));// [[3,5],[6,9],[12,14]]// 测试用例4:回文结构Strings4="aba";System.out.println("Test 4: "+solution.largeGroupPositions(s4));// []// 测试用例5:整个字符串都是同一字符Strings5="aaaaaa";System.out.println("Test 5: "+solution.largeGroupPositions(s5));// [[0,5]]// 测试用例6:空字符串Strings6="";System.out.println("Test 6: "+solution.largeGroupPositions(s6));// []// 测试用例7:单字符Strings7="a";System.out.println("Test 7: "+solution.largeGroupPositions(s7));// []// 测试用例8:两字符Strings8="aa";System.out.println("Test 8: "+solution.largeGroupPositions(s8));// []// 测试用例9:正好3个字符Strings9="aaa";System.out.println("Test 9: "+solution.largeGroupPositions(s9));// [[0,2]]// 测试用例10:结尾有较大分组Strings10="aaabbb";System.out.println("Test 10: "+solution.largeGroupPositions(s10));// [[0,2],[3,5]]// 测试用例11:开头有较大分组Strings11="bbbaaa";System.out.println("Test 11: "+solution.largeGroupPositions(s11));// [[0,2],[3,5]]}

关键点

  1. 边界处理

    • 字符串长度小于3时直接返回空列表
    • 处理字符串末尾的字符组(循环结束后)
  2. 指针更新

    • 只有在字符发生变化时才更新起始位置
    • 长度计算为i - start(当前索引减去起始索引)

常见问题

  1. 为什么需要单独处理末尾的字符组?
    循环在i < n时结束,最后一个字符组不会触发字符变化的条件,需要在循环外单独处理。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 21:22:16

龙芯双周会--硬核的技术讨论会

龙芯爱好者社区创立于 2024 年 10 月 24 日程序员节&#xff0c;是一个由第三方爱好者、行业人员与学生组成的&#xff0c;致力于龙芯&#xff08;龙架构&#xff09;软硬件生态建设的互联网社区。 “龙芯双周会”是“龙芯爱好者社区”每两周举办的一次技术交流。在这里没有领…

作者头像 李华
网站建设 2026/4/28 17:24:28

从零到上线:Open-AutoGLM在Windows 10/11的完整部署路径(附脚本工具包)

第一章&#xff1a;Open-AutoGLM部署概述Open-AutoGLM 是一个开源的自动化通用语言模型推理与部署框架&#xff0c;旨在简化大语言模型在生产环境中的集成流程。该框架支持多种后端引擎、动态批处理、模型量化以及 REST/gRPC 接口暴露&#xff0c;适用于高并发、低延迟的 AI 服…

作者头像 李华
网站建设 2026/4/16 16:15:04

如何评估一个公司的测试文化和技术水平?

测试作为核心竞争力的时代‌ 在2025年的今天&#xff0c;软件质量已直接关乎企业的生存与发展。敏捷、DevOps、持续交付等范式普及&#xff0c;使得测试不再仅是开发流程的末端环节&#xff0c;而是贯穿价值交付全程的核心保障与反馈机制。因此&#xff0c;评估一个公司的测试…

作者头像 李华
网站建设 2026/4/29 0:01:48

‌从测试到韧性:软件测试从业者的灾难恢复演练实战指南

测试在灾难恢复中的核心价值‌ 在软件系统的生命周期中&#xff0c;灾难恢复&#xff08;Disaster Recovery, DR&#xff09;不仅是运维团队的职责&#xff0c;更是测试从业者保障业务连续性的关键战场。DR流程测试演练通过模拟真实灾难场景&#xff08;如数据中心故障、网络中…

作者头像 李华
网站建设 2026/4/18 7:12:45

基于Springboot和vue的餐饮管理系统的设计与实现

系统简介 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&…

作者头像 李华