3. LeetCode1156 : 单字符重复子串的最大长度

1156. 单字符重复子串的最大长度

如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。
给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。

大致思路:
考虑一组字符串 s=“CDAABAABAAA”,其最长单字符重复子串必然是s[5]-s[10],其中B被替换。
具体的,遍历时设一个指针start指向开始字符,一个指针cur指向当前字符,cur递加,那么

  1. s[start]==s[cur],说明重复,继续循环

  2. s[start]!=s[cur],这是因为可以选择交换一次字符,所以假设有可以被交换的字符,那么再设一个指针diff,其初始值为-1,指向第一个异与开始字符的下标diff=cur,此时:

    • 若diff==-1&&s[start]=s[cur+1],说明交换的机会还没有被用掉,且从别的地方拉一个过来有用,继续循环;
    • 否则,说明要么没有机会交换了,或者交换了也连不起来
  3. 这时就要退出这次的循环,开始找第二组重复字符串:

    • diff==-1,说明没交换过,start置为cur即可;
    • diff!=-1,start就从第一个不同的字符处再开始找,直到结束。
  4. 在结束循环之前,还得保存这次循环找到的最大长度,即为len=cur-start,但是2中是假设有字符可以被交换,此时需要验证假设,显然如果len<当前循环中所匹配的字符的总个数,那么说明这个字符可以从别处调过来,否则,就要拿第一个或是最后一个抵上,此外如果这时diff==-1,说明没用到这个交换,如果还有空余字符,那么可以直接把它调到子串的最后面,len++。

  5. 这说明我们最开始需要统计一遍所有字符的个数。

详细步骤见代码与注释:

class Solution {public int maxRepOpt1(String text) {//如果字符串空则直接返回0if(text==null||"".equals(text)){return 0;}//变成数组方便计算char[] s=text.toCharArray();//建立数组统计字符个数int[] record = new int[26];//方便计算边界for(int i=0;i<s.length;i++){record[s[i]-'a']++;}//记录开始下标与当前下标int start=0,cur=1;int diff=-1;//记录第一个不同元素的indexint len=1,maxLen=1;//保存结果//当前位置还在数组范围内时while(cur<s.length){if(s[cur]==s[start]){//如果相等,则cur往前走cur++;continue;}else if(diff==-1&&cur+1<s.length&&s[cur+1]==s[start]){//还没有交换过且交换有用diff=cur;cur++;}else{//计算长度len=cur-start;//分两种情况讨论,这里感觉没写好if(diff==-1) {len += len < record[s[start] - 'a'] ? 1 : 0;}else {len += len <= record[s[start] - 'a'] ? 0 : -1;}maxLen=Math.max(len,maxLen);//重置所有标识位start=diff==-1?cur:diff;cur=start+1;diff=-1;}}//如果最后一个字符没有进入else部分直接出来了,如“aaaa”,所有还要比较一下len=cur-start;if(diff==-1) {len += len < record[s[start] - 'a'] ? 1 : 0;}else {len += len <= record[s[start] - 'a'] ? 0 : -1;}return Math.max(len,maxLen);}
}

LeetCode1156. 单字符重复子串的最大长度相关推荐

  1. sqlserver text最大长度_1156. 单字符重复子串的最大长度

    1156. 单字符重复子串的最大长度 这道题测试用例都比较简单,用暴力也可以过. 遍历text字符串,假设当前遍历下标为i,我们匹配text[i]这个字符,向右遍历找到第一个不是text[i]的字符b ...

  2. LeetCode 1156. 单字符重复子串的最大长度

    文章目录 1. 题目 2. 解题 1. 题目 如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串. 给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符 ...

  3. Leetcode-1156 Swap For Maximum Repeated Substring(单字符重复子串的最大长度)

    因为只能交换一次,先考虑如果不交换最大的值. 接下来考虑交换,有四种情况 ① aaabaaa型 交换一下可以将相邻的两块连在一起,答案就是两块长度之和 ② aaabbbaaaa 交换一下也不能连起两块 ...

  4. 最长重复子串(Rabin-Karp算法)

    目录 最长重复子串 C++代码 最长重复子串 1044. 最长重复子串 给出一个字符串 S,考虑其所有重复子串(S 的连续子串,出现两次或多次,可能会有重叠). 返回任何具有最长可能长度的重复子串.( ...

  5. 求字符串中最长无重复字符的子串

    题目:求一个字符串中最长的没有重复字符的子串. 思路:用hash表从i遍历查看包含i的最长 无重复子串. int max_unique_substring2(char * str) {int i,j; ...

  6. 寻找一个字符串中的最长不重复子串的长度

    2019独角兽企业重金招聘Python工程师标准>>> 算法使用两个下标来分别代表不重复子串的第一个字符的前一个字符和最后一个字符,记为i和j flag为长度,n为比较的参数 < ...

  7. 最长不含重复字符的子串

    最长不含重复字符的子串 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符 ...

  8. 替换k个字符后最长重复子串

    2019独角兽企业重金招聘Python工程师标准>>> Longest Repeating Character Replacement 问题: Given a string that ...

  9. 最长不重复子串的长度(python)

    算法思路: 1.使用两个指针i.j分别表示无重复子串的首尾索引,指针向右偏移,不会返回 2.使用一个字典记录遍历字符串时,每个字符出现在字符串中的最后位置 3.当未出现重复时,i的值不变:如果出现重复 ...

  10. 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...

最新文章

  1. 数据结构课本学习 --单链表类定义
  2. linux关闭硬件蜂鸣器,Linux Tips: 如何关闭系统的蜂鸣器
  3. android studio 创建.9文件,自己使用Android studio创建.9(点9)图片
  4. java io流学设置编码_Java学习日志(21-2-IO流-基本数据类型与字节数组对象与、编码解码)...
  5. CentOS 7虚拟机支持virsh console访问
  6. MySQL学习-MySQL数据库事务
  7. python try except continue_python中 try、except、finally执行顺序
  8. Spring事务和事务传播机制
  9. 电工学习通:电路图符号知识大全
  10. mysql compute_compute by 的使用
  11. 从冬令营到字节跳动,我从ICPCer变身Bytedancer
  12. 基于Apache APISIX,新浪微博API网关的定制化开发之路
  13. python基础篇{数据类型}
  14. 暴雪定不负我?(20220123 Week3-3)
  15. 如何使用计算机搜索文件,win7系统如何使用搜索筛选功能快速查找文件
  16. 复旦大学计算机学院金玲飞,金玲飞 - 复旦大学 - 计算机科学技术学院
  17. servlet 中的ServletConfig与servletContext
  18. FPGA系统性学习笔记连载_Day19【综合实验】之【数字钟】【Intel Cycle IV FPGA平台验证】
  19. 【“互联网+”大赛华为云赛道】EI命题攻略:华为云EI的能力超丰富,助你实现AI梦想
  20. hiredis linux 编译,Linux系统整合hiredis

热门文章

  1. 摘果子问题(聚沙成塔问题)
  2. 解决国外软件官网打不开,浏览器访问经常卡在正在建立TLS握手安全连接。
  3. C++ basic_string
  4. 计算机无法筛选怎么办,电脑突然出现什么筛选键怎么处理?
  5. Spring—事务配置及mybatis整合
  6. 高效沟通的方法与技巧(转自飞马网)
  7. java学习之htlm总结
  8. Servlet技术(第三章)
  9. JAVA相关基础知识
  10. 我的世界java1.15.2光影_我的世界Java版带光影