leetcode刷题之424.替换后的最长重复字符

这是一道关于字符串处理的算法题,目标是找到在允许最多k次字符替换的情况下,字符串中最长的包含重复字母的子串。解题思路类似于求最长连续子串,通过滑动窗口来维护当前窗口内的字符统计,当窗口内某个字符数量超过窗口长度时,窗口向右扩展。最终返回的是在允许替换次数限制下,最长重复子串的长度。
摘要由CSDN通过智能技术生成

题目

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

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

思路

这道题我第一次做类似的,并没有什么头绪。于是借鉴了评论区的一个solution,大神写的很清楚。图片我就偷一张
窗口移动过程

这个思路和求字符串中最长连续子串的思路差不多,只是关键的一些判断条件有改变。

当出现较长的连续序列的时候,窗口就应该进行扩展,如果当前还没有超过窗口长度的序列就进行平移。
如果要记录窗口长度最大值,按我自己的思路可能不会对拿变量去统计一些值的最大值,但是大神不一样,使用一个map容器就可以统计win里面的重复字符。

判断window是否需要扩展的依据:只需要判断当前加上新元素之后当前元素在win中的个数是否超过win本身长度。也就是说只有当前win中全是一个字符这时候窗口右侧的字符还是这个字符的情况下,窗口的最大值就增加。

class Solution {
public:
int characterReplacement(string s, int k) {
	if(s.size() <= 1) return s.size();
	if(s.size() <= k) return s.size();
	
	int left = 0;
	int right = 0;
	int historyMaxSize = 0;
	int *map = new int[26]();
	//1.首先做循环遍历
	for (char c : s) {
		map[c - 'A'] ++;
		historyMaxSize = max(historyMaxSize , map[c - 'A']);
		//这个地方说明当前没有更长的historyMaxSize + k是指调整过的长度
		if(right - left + 1 >  historyMaxSize + k) {
		 	//整个窗口进行右移
		 	left ++;
		 	map[s[left] - 1] --;
		}
		right ++;
	}
	delete [] m;
	//返回的值是s.size() - left
	return s.size() - left;
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值