LeetCode-刷题 424 替换后最长的字符串

LeetCode-刷题 424 替换后最长的字符串

题目概述

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

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

示例

示例 1:

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

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

方法

想法:首先看到这道题,需要注意到一个限制条件就是K,只能替换到K个不同的字符,以此来找到最长的字符串。这就能自然而然的想到使用一个滑动的窗口去搜索这个最长的相同的字符串。

1.设置左右的双指针来控制滑动窗口,使用一个vector容器来存储滑动窗口内的每个字符的数量,需要保证的是在这个滑动窗口中的字符除了出现最多的那个字符外的,其他的个数不能超过K个。
2.每次控制右指针移动,如果不满足1的条件,则左指针向左移动。相应的vector容器中对应字符的数量也应减1.

代码

class Solution {
public:
    int characterReplacement(string s, int k) {
    		//使用容器存储滑动窗口内字符的数量
            vector<int > num(26);
            int n = s.length();
            int maxn = 0;
            int left = 0,right = 0;
            while(right<n)
            {
            //遍历的每个字符都优先存入,与最大数量的字符对比
                num[s[right]-'A']++;
                maxn = max(num[s[right]-'A'],maxn);
                if(right-left+1-maxn>k)
                {
                    num[s[left]-'A']--;
                    left++;
                }
                right++;
            }
            return right-left;
    }
};

结果

在这里插入图片描述

思考

个人感觉最重要的就是在左指针的移动上,若不满足替换K个不同字符,则左指针移动,左指针的移动就是为了保存原来的最长长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值