LeetCode-424:替换后的最长重复字符

举报
小小谢先生 发表于 2022/04/16 00:42:56 2022/04/16
【摘要】 题目描述: 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。 注意:字符串长度 和 k 不会超过 104。   示例 1: 输入:s = "ABAB", k = 2 输出:4 解释...

题目描述:

给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。

注意:字符串长度 和 k 不会超过 104。

 

示例 1:

输入:s = "ABAB", k = 2
输出:4
解释:用两个'A'替换为两个'B',反之亦然。
示例 2:

输入:s = "AABABBA", k = 1
输出:4
解释:
将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。
子串 "BBBB" 有最长重复字母, 答案为 4

 

思路分析:

一看到最长字符串就想到滑动窗口。

算法流程:

  • 右边界先移动找到一个满足题意的可以替换 k 个字符以后,所有字符都变成一样的当前看来最长的子串,直到右边界纳入一个字符以后,不能满足的时候停下;
  • 然后考虑左边界向右移动,左边界只须要向右移动一格以后,右边界就又可以开始向右移动了,继续尝试找到更长的目标子串;
  • 替换后的最长重复子串就产生在右边界、左边界交替向右移动的过程中。

  
  1. class Solution {
  2. public int characterReplacement(String s, int k) {
  3. int len=s.length();
  4. if(len<2){
  5. return len;
  6. }
  7. char[] chararray=s.toCharArray();
  8. int left=0,right=0;
  9. int maxCount=0,res=0;
  10. int[] freq = new int[26];
  11. while(right<len){
  12. freq[chararray[right]-'A']++;
  13. maxCount=Math.max(maxCount,freq[chararray[right]-'A']);
  14. right++;
  15. if(right-left>maxCount+k){
  16. freq[chararray[left]-'A']--;
  17. left++;
  18. }
  19. res=Math.max(res,right-left);
  20. }
  21. return res;
  22. }
  23. }

复杂度分析:

时间复杂度:O(N),这里 N 是输入字符串 S 的长度;
空间复杂度:O(A),这里 A 是输入字符串 S 出现的字符 ASCII 值的范围。

 

文章来源: blog.csdn.net,作者:小小谢先生,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/xiewenrui1996/article/details/113700187

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。