博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode 424.替换后的最长重复字符
阅读量:4324 次
发布时间:2019-06-06

本文共 1674 字,大约阅读时间需要 5 分钟。

替换后的最长重复字符

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

注意:

字符串长度 和 k 不会超过 104

示例 1:

输入:

s = "ABAB", k = 2

 

输出:

4

 

解释:

用两个'A'替换为两个'B',反之亦然。

示例 2:

输入:

s = "AABABBA", k = 1

 

输出:

4

 

解释:

将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。

子串 "BBBB" 有最长重复字母, 答案为 4。

 

 

思路:

 

题目的意思比较清楚,不过可能的情况有很多,不可能用代码去寻找最佳的替换位置,所以这里采用一种滑动窗口的方法。

 

定义start和end两个标记,中间的内容即是窗口,计算窗口内所有字母出现的次数,因为全是大写字母,所以可以用一个26位的数组来记录窗口内每个字母出现的次数。

 

找到窗口内出现最多的次数,加上允许替换的字母数k,看是否超过窗口宽度,如果超过了,说明窗口还可以更长, 也就是说窗口内重复的字母的长度可以更长,就将end右移一位,形成新的窗口,然后继续重复上面的步骤。如果没超过,说明能构成的最长的重复字母长度已经到顶了,这时应该将start右移一位,来寻找新的可能的更长重复字母长度。

 

每次计算重复字母长度时,当出现更长的可能时,都更新最终的结果。

 

为了减少时间复杂度,我们不去每次都遍历窗口来计算出现的字母次数,而是在移动end或者start时,将对应位置的字母的次数加一或者减一。

 

要注意各种边界条件是什么。

 

1 public class Solution { 2     public int characterReplacement(String s, int k) { 3         if (s.length() < 1) return 0; 4         int start = 0; 5         int end = 0; 6         int res = 0; 7         int[] charNum = new int[26]; 8         charNum[s.charAt(0) - 'A']++; 9         while (s.length() > end) {10             int maxChar = 0;11             for (int i = 0; i < 26; i++) {12                 if (charNum[i] > maxChar)13                     maxChar = charNum[i];14             }15             if (maxChar + k > end - start) {16                 end++;17                 if (end < s.length())18                     charNum[s.charAt(end) - 'A']++;19             } else {20                 charNum[s.charAt(start) - 'A']--;21                 start++;22             }23             if (maxChar + k > res)24                 res = maxChar + k <= s.length() ? maxChar + k : s.length();25         }26         return res;27     }28 }

 

转载于:https://www.cnblogs.com/kexinxin/p/10242222.html

你可能感兴趣的文章
阶段3 2.Spring_04.Spring的常用注解_7 改变作用范围以及和生命周期相关的注解
查看>>
阶段3 2.Spring_05.基于XML的IOC的案例1_3 测试基于XML的IOC案例
查看>>
阶段3 2.Spring_04.Spring的常用注解_4 由Component衍生的注解
查看>>
阶段3 2.Spring_06.Spring的新注解_2 spring的新注解-Bean
查看>>
阶段3 2.Spring_04.Spring的常用注解_6 用于注入数据的注解
查看>>
阶段3 2.Spring_06.Spring的新注解_3 AnnotationConfigApplicationContext的使用
查看>>
阶段3 2.Spring_07.银行转账案例_2 案例中添加转账方法并演示事务问题
查看>>
阶段3 2.Spring_07.银行转账案例_6 测试转账并分析案例中的问题
查看>>
阶段3 2.Spring_07.银行转账案例_7 代理的分析
查看>>
阶段3 2.Spring_07.银行转账案例_3 分析事务的问题并编写ConnectionUtils
查看>>
阶段3 2.Spring_07.银行转账案例_9 基于子类的动态代理
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_1 AOP的概念
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_4 spring基于XML的AOP-配置步骤
查看>>
阶段3 2.Spring_07.银行转账案例_10 使用动态代理实现事务控制
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_8 spring中的环绕通知
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_10 总结和作业安排
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_2 JdbcTemplate的概述和入门
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_7 通用化切入点表达式
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_6 JdbcDaoSupport的使用以及Dao的两种编写方式...
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置
查看>>