news 2026/6/10 20:23:11

算法题 较大分组的位置

作者头像

张小明

前端开发工程师

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/6/10 13:56:46

Docker在测试环境中的应用:效率、一致性与敏捷性的变革

在软件交付周期日益缩短、技术栈日趋复杂的今天&#xff0c;测试环境的稳定性、一致性与快速部署能力&#xff0c;已成为决定测试效能与发布质量的关键瓶颈。传统的物理机或虚拟机环境&#xff0c;常因配置差异、资源争用和启动缓慢等问题&#xff0c;导致“在我机器上是好的”…

作者头像 李华
网站建设 2026/6/10 14:47:25

Kubernetes上的测试:挑战与解决方案

测试范式的转变 Kubernetes已成为云原生应用事实上的部署与运行标准。其带来的自动扩缩容、滚动更新、声明式配置等特性&#xff0c;在提升运维效率和资源利用率的同时&#xff0c;也彻底改变了应用的运行态。对于测试团队而言&#xff0c;这意味着测试对象从一个相对静态的“…

作者头像 李华
网站建设 2026/6/10 12:58:18

如何在个人电脑部署Open-AutoGLM:从环境配置到成功运行全记录

第一章&#xff1a;Open-AutoGLM 本地部署概述Open-AutoGLM 是一个开源的自动化代码生成与推理框架&#xff0c;基于 GLM 架构实现本地化智能编程辅助。该系统支持代码补全、函数生成、错误修复等功能&#xff0c;适用于开发者在隔离环境中构建智能化开发流程。通过本地部署&am…

作者头像 李华
网站建设 2026/6/10 15:29:36

RRT*算法与三次 B 样条函数在机械臂轨迹避障中的应用

一种采用RRT*机械臂轨迹避障算法&#xff0c;然后采用三次B 样条函数对 所 规 划 路 径 进 行 拟 合 优 化。 带有较为详细的注视 rrt路径规划结合机械臂仿真 基于matlab&#xff0c;6自由度&#xff0c;机械臂rrt算法路径规划&#xff0c;输出如下效果&#xff0c;直接运行即可…

作者头像 李华
网站建设 2026/6/9 17:13:40

如何利用有限的数据发表更多的SCI论文?——利用ArcGIS探究环境和生态因子对水体、土壤和大气污染物的影响

SCI的写作和发表是科研人提升自身实力和实现自己价值的必要途径。“如何利用有限的数据发表更多的SCI论文&#xff1f;”是我们需要解决的关键问题。一&#xff1a;ARCGIS软件的基本介绍和如何获取空间数据1. ArcGIS软件初识与如何获取空间数据&#xff1a;1.1 ArcCatalog、Arc…

作者头像 李华
网站建设 2026/6/10 9:31:20

uni-app 项目在 iOS 上架过程中常见的问题与应对方式

在 uni-app 项目里&#xff0c;开发阶段通常推进得很顺。页面逻辑、接口对接、跨端兼容&#xff0c;一旦跑通&#xff0c;团队很容易形成一种判断&#xff1a;“剩下的就是打包和上架了。” 但真正进入 App Store 上架流程后&#xff0c;很多问题才开始出现&#xff0c;而且这些…

作者头像 李华