网站建设飠金手指排名十一,一个空间放两个网站,了解基本的php wordpress,手机网站js触屏滑动图片特效830. 较大分组的位置
问题描述
在一个由小写字母组成的字符串 s 中#xff0c;如果某一组连续字符的长度大于或等于 3#xff0c;则称其为 较大分组。
返回每一个较大分组的起始和结束位置#xff08;索引从 0 开始#xff09;。结果按起始位置升序排列。
示例#xff1a;…830. 较大分组的位置问题描述在一个由小写字母组成的字符串s中如果某一组连续字符的长度大于或等于3则称其为较大分组。返回每一个较大分组的起始和结束位置索引从 0 开始。结果按起始位置升序排列。示例输入:sabbxxxxzzy输出:[[3,6]]解释:xxxx是一个较大分组起始位置3结束位置6。输入:sabc输出:[]解释:没有长度≥3的连续字符组。输入:sabcdddeeeeaabbbcd输出:[[3,5],[6,9],[12,14]]解释:ddd、eeee、bbb都是较大分组。输入:saba输出:[]算法思路双指针核心思想使用两个指针标记当前连续字符组的起始和结束位置遍历字符串当字符发生变化时检查当前组的长度边界处理空字符串或单字符直接返回空列表整个字符串都是同一字符检查总长度是否 ≥ 3代码实现importjava.util.*;classSolution{/** * 找出字符串中所有较大分组连续相同字符长度≥3的位置 * * param s 输入字符串仅包含小写字母 * return 较大分组的起始和结束位置列表按起始位置升序排列 */publicListListIntegerlargeGroupPositions(Strings){ListListIntegerresultnewArrayList();// 边界情况字符串长度小于3不可能有较大分组if(snull||s.length()3){returnresult;}intns.length();intstart0;// 当前连续字符组的起始位置// 从索引1开始遍历比较当前字符与前一个字符for(inti1;in;i){// 当字符发生变化时处理前一个字符组if(s.charAt(i)!s.charAt(i-1)){// 计算当前组的长度intlengthi-start;// 如果长度≥3添加到结果中if(length3){ListIntegergroupArrays.asList(start,i-1);result.add(group);}// 更新起始位置为当前字符的位置starti;}}// 处理最后一个字符组字符串末尾的情况// 最后一个组的长度为 n - startif(n-start3){ListIntegergroupArrays.asList(start,n-1);result.add(group);}returnresult;}}算法分析时间复杂度O(n)只需要遍历字符串一次每个字符只被访问一次空间复杂度O(1)不计算输出空间除了存储结果外只使用常数额外空间算法过程输入s abcdddeeeeaabbbcd初始化start 0i 1b ! a组长度 1-0 1 3start 1i 2c ! b组长度 2-1 1 3start 2i 3d ! c组长度 3-2 1 3start 3i 4d d继续i 5d d继续i 6e ! d组长度 6-3 3 ≥ 3添加[3,5]start 6i 7,8,9连续e继续i 10a ! e组长度 10-6 4 ≥ 3添加[6,9]start 10i 11a a继续i 12b ! a组长度 12-10 2 3start 12i 13,14连续b继续i 15c ! b组长度 15-12 3 ≥ 3添加[12,14]start 15i 16d ! c组长度 16-15 1 3start 16循环结束处理末尾组长度 17-16 1 3结果[[3,5],[6,9],[12,14]]测试用例publicstaticvoidmain(String[]args){SolutionsolutionnewSolution();// 测试用例1标准示例Strings1abbxxxxzzy;System.out.println(Test 1: solution.largeGroupPositions(s1));// [[3,6]]// 测试用例2无较大分组Strings2abc;System.out.println(Test 2: solution.largeGroupPositions(s2));// []// 测试用例3多个较大分组Strings3abcdddeeeeaabbbcd;System.out.println(Test 3: solution.largeGroupPositions(s3));// [[3,5],[6,9],[12,14]]// 测试用例4回文结构Strings4aba;System.out.println(Test 4: solution.largeGroupPositions(s4));// []// 测试用例5整个字符串都是同一字符Strings5aaaaaa;System.out.println(Test 5: solution.largeGroupPositions(s5));// [[0,5]]// 测试用例6空字符串Strings6;System.out.println(Test 6: solution.largeGroupPositions(s6));// []// 测试用例7单字符Strings7a;System.out.println(Test 7: solution.largeGroupPositions(s7));// []// 测试用例8两字符Strings8aa;System.out.println(Test 8: solution.largeGroupPositions(s8));// []// 测试用例9正好3个字符Strings9aaa;System.out.println(Test 9: solution.largeGroupPositions(s9));// [[0,2]]// 测试用例10结尾有较大分组Strings10aaabbb;System.out.println(Test 10: solution.largeGroupPositions(s10));// [[0,2],[3,5]]// 测试用例11开头有较大分组Strings11bbbaaa;System.out.println(Test 11: solution.largeGroupPositions(s11));// [[0,2],[3,5]]}关键点边界处理字符串长度小于3时直接返回空列表处理字符串末尾的字符组循环结束后指针更新只有在字符发生变化时才更新起始位置长度计算为i - start当前索引减去起始索引常见问题为什么需要单独处理末尾的字符组循环在i n时结束最后一个字符组不会触发字符变化的条件需要在循环外单独处理。