博客
关于我
每日一题 21.02.02 LeetCode 424. 替换后的最长重复字符 Java题解
阅读量:758 次
发布时间:2019-03-23

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

问题分析

我们需要找到字符串中最长的子串,使得子串中至少有k个大写字母。这个问题可以通过滑动窗口(Sliding Window)技术来解决。滑动窗口方法适用于这类子串问题,因为它能够高效地找到满足条件的最大长度。

方法思路

  • 初始化指针和数组:使用两个指针left和right来控制窗口的左右边界,同时使用一个数组nums来记录每个字母的出现次数。

  • 遍历字符串:将right指针从左向右移动,逐个字符处理,更新其在字母计数数组中的值。同时,维护一个当前窗口中大写字母数量的最大值max。

  • 调整窗口:当窗口中大写字母的数量小于k时,使用left指针向右移动,减少窗口大小,同时调整字母计数数组,逐步保证窗口内满足条件。

  • 记录最大窗口长度:每次满足条件时,计算当前窗口长度,更新最大长度。

  • 解决代码

    class Solution {    public int characterReplacement(String s, int k) {        int len = s.length();        int[] nums = new int[26];        int left = 0;        int max = 0;        int result = 0;        for (int right = 0; right < len; right++) {            char c = s.charAt(right);            if (Character.isUpperCase(c)) {                int index = c - 'A';                nums[index]++;            }            // Update max with current window's max uppercase count            if (max < k) {                // Need to move left pointer to reduce window size                if (left <= right) {                    char leftC = s.charAt(left);                    if (Character.isUpperCase(leftC)) {                        int leftIndex = leftC - 'A';                        nums[leftIndex]--;                    }                    left++;                }            }            // Update the maximum length if current window satisfies the condition            if (max >= k) {                int currentLength = right - left + 1;                if (currentLength > result) {                    result = currentLength;                }            }        }        return result;    }}

    代码解释

  • 初始化变量:创建字母计数数组nums,初始化left指针为0,max记录当前窗口中最大大写字母数量,result存储最终的最大窗口长度。

  • 遍历字符串:通过外部循环从左到右遍历字符串,每一步处理right指针所指的字符。

  • 更新字母计数:如果当前字符是大写字母,更新对应位置的计数。

  • 调整窗口:检查当前窗口的最大大写字母数量是否满足k,如果不满足,移动left指针并更新字母计数,逐步调整窗口以确保满足条件。

  • 记录最大窗口长度:当窗口满足条件时,计算当前窗口长度并与result比较,更新最大值。

  • 这种方法通过尽可能扩大窗口直到满足条件,然后调整窗口的策略,有效地找到最长的子串,确保了结果的正确性,同时保持了算法的高效性。

    转载地址:http://tkjzk.baihongyu.com/

    你可能感兴趣的文章
    RabbitMQ - 死信、TTL原理、延迟队列安装和配置
    查看>>
    PHP数据访问的多重查询(租房子查询)
    查看>>
    RabbitMQ - 如保证消息的可靠性?(消息确认、消息持久化、失败重试机制)
    查看>>
    RabbitMQ - 基于 SpringAMQP 带你实现五种消息队列模型
    查看>>
    php数组函数分析--array_column
    查看>>
    php数组去重复数据的小例子
    查看>>
    php数组实现:哈希 +双向链表
    查看>>
    PHP数组排序函数array_multisort()函数详解(二)
    查看>>
    php数组的几个函数和超全局变量
    查看>>
    PHP文件上传详解
    查看>>
    PHP文件锁
    查看>>
    php文本框输入制定文本,php – 当用户没有向文本框输入任何内容时...
    查看>>
    PHP时间戳和日期相互转换操作总结
    查看>>
    php时间戳知识点,php 时间戳函数总结与示例
    查看>>
    php更新数据库失败,php – 无法更新MySQL数据库
    查看>>
    php机器人聊天对话框,基于AIML的PHP聊天机器人
    查看>>
    PHP查找数组中最大值与最小值
    查看>>
    php查最大值,在PHP数组中查找最大值
    查看>>
    php标签筛选,关于PHP CodeIgniter框架中通过<a>标签和url做多条件分类筛选
    查看>>
    php根据年月日计算年龄
    查看>>