leetcode 424. Longest Repeating Character Replacement

257 篇文章 17 订阅

Given a string that consists of only uppercase English letters, you can replace any letter in the string with another letter at most k times. Find the length of a longest substring containing all repeating letters you can get after performing the above operations.

Note:
Both the string's length and k will not exceed 104.

Example 1:

Input:
s = "ABAB", k = 2

Output:
4

Explanation:
Replace the two 'A's with two 'B's or vice versa.

Example 2:

Input:
s = "AABABBA", k = 1

Output:
4

Explanation:
Replace the one 'A' in the middle with 'B' and form "AABBBBA".
The substring "BBBB" has the longest repeating letters, which is 4.

我们可以对字符串做出最多k次更改。假设这个k是没有限制的无限大,我们把一个字符串以最小的改变来变为所有字符都一样,那么这个答案将是:

字符串的长度 - 字符串中出现最多的字符的出现次数

再假设我们做出最多k次更改。那么可以保持一个滑动窗口,来满足这个(做出最多k次更改使得滑动窗口中所有字符都一样)的限制。

(滑动窗口字符串的长度 - 在滑动窗口字符串中出现最多的字符的出现次数) <= k

解法如下:

public int characterReplacement(String s, int k) {
	int[] letters=new int[26];
	int maxRepeatedLength=0;
	int maxCount=0;
	int start=0;
	for(int end=0;end<s.length();end++){
		char c=s.charAt(end);
		letters[c-'A']++;
		maxCount=Math.max(maxCount, letters[c-'A']);
		while( (end-start+1-maxCount) > k ){  //end-start+1是子串(当前滑动窗口的)长度
			letters[s.charAt(start)-'A']--;
			start++;			
		}
		maxRepeatedLength=Math.max(maxRepeatedLength, end-start+1);
	}
	return maxRepeatedLength;
}

思路如下:

这个问题会被转变为::
"最长的子串,使得 (length - max occurrence) <= k"
假设我们找到了这样一个有效的子串,那么下一步做什么?

  1. 如果在子串后再增加一个新的字符,仍能满足要求——我们很开心,只需要增加滑动窗口的长度
  2. 再增加新的字符后,不再满足要求。那么我们需要减少滑动窗口的长度吗?
    ——不,我们只需要向右移动滑动窗口,这样滑动窗口的长度不变。
    因为以任何小于等于之前start来开始的滑动窗口,都不会比有机会获得一个比当前窗口长度更长的有效子串。
  3. 我们需要在每次滑动时,及时地更新maxCount吗?
    ——没有必要. 我们只专注于 "最长的"。那么有效子串的长度取决于什么?
    Max Occurrence + k
    我们只需要在maxCount变得更大时,更新maxCount。因为只有这种情况,我们才能产生一个更长的有效子串。
    如果当前maxCount并没有超过历史的maxCount,那么我们将不能从当前的"start"开始构造出一个更长的有效子串。

因为我们只关心最长有效子串,所以滑动窗口将不会收缩。因此如果当前窗口的状态是一个无效的子串时,我们 要么把end增加一位,使得窗口长度增加;要么把start和end都增加一位,使得窗口长度不变,往右滑动一格。并且,我们只有当且仅当新字符的count超过历史最大count时,才增加窗口长度。

所以,我们不需要确切而及时地知道当前窗口的最大count为多少,我们只关心当前窗口的最大count是否超过历史最大count(而这只会发生在新字符出现 使得count增加时)


使用优化算法,以优化VMD算法的惩罚因子惩罚因子 (α) 和分解层数 (K)。 1、将量子粒子群优化(QPSO)算法与变分模态分解(VMD)算法结合 VMD算法背景: VMD算法是一种自适应信号分解算法,主要用于分解信号为不同频率带宽的模态。 VMD的关键参数包括: 惩罚因子 α:控制带宽的限制。 分解层数 K:决定分解出的模态数。 QPSO算法背景: 量子粒子群优化(QPSO)是一种基于粒子群优化(PSO)的一种改进算法,通过量子行为模型增强全局搜索能力。 QPSO通过粒子的量子行为使其在搜索空间中不受位置限制,从而提高算法的收敛速度与全局优化能力。 任务: 使用QPSO优化VMD中的惩罚因子 α 和分解层数 K,以获得信号分解的最佳效果。 计划: 定义适应度函数:适应度函数根据VMD分解的效果来定义,通常使用重构信号的误差(例如均方误差、交叉熵等)来衡量分解的质量。 初始化QPSO粒子:定义粒子的位置和速度,表示 α 和 K 两个参数。初始化时需要在一个合理的范围内为每个粒子分配初始位置。 执行VMD分解:对每一组 α 和 K 参数,运行VMD算法分解信号。 更新QPSO粒子:使用QPSO算法更新粒子的状态,根据适应度函数调整粒子的搜索方向和位置。 迭代求解:重复QPSO的粒子更新步骤,直到满足终止条件(如适应度函数达到设定阈值,或最大迭代次数)。 输出优化结果:最终,QPSO算法会返回一个优化的 α 和 K,从而使VMD分解效果最佳。 2、将极光粒子(PLO)算法与变分模态分解(VMD)算法结合 PLO的优点与适用性 强大的全局搜索能力:PLO通过模拟极光粒子的运动,能够更高效地探索复杂的多峰优化问题,避免陷入局部最优。 鲁棒性强:PLO在面对高维、多模态问题时有较好的适应性,因此适合海上风电时间序列这种非线性、多噪声的数据。 应用场景:PLO适合用于优化VMD参数(α 和 K),并将其用于风电时间序列的预测任务。 进一步优化的建议 a. 实现更细致的PLO更新策略,优化极光粒子的运动模型。 b. 将PLO优化后的VMD应用于真实的海上风电数据,结合LSTM或XGBoost等模型进行风电功率预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值