424. 替换后的最长重复字符

本文介绍了一种使用滑动窗口技术解决字符串替换问题的方法。通过维护一个计数数组来跟踪当前窗口内的字符数量,确保通过最多k次修改可以使字符串变为单一字符组成。文章详细解释了算法流程,并提供了完整的C++代码实现。

class Solution {
public:
    int characterReplacement(string s, int k) 
    {
        // 用一个数组来保存当前窗口内每个字符的最大的长度
        vector<int> cnt (26,0);
        // 滑动窗口的最左侧
        int left = 0;
        // 记录当前相同的单个字符的最大个数
        int maxCharCnt = 0;
        for (int right = 0; right < s.size(); ++right)
        {
            int charInt = s[right]-'A';
            cnt[charInt]++;
            maxCharCnt = max(maxCharCnt, cnt[charInt]);
            // 当前窗口即使通过修改也无法满足了,那就要移动窗口left
            if (right - left + 1 - maxCharCnt >  k)
            {
                // 最左边字符
                cnt[s[left]-'A']--;
                left++;
            }
            // 否则left不变,移动right,窗口加大 1
        }
        return s.size() - left;
    }
};

 

在允许替换不超过 `k` 个字符的情况下,找到包含相同字符的最长子串的长度,这类问题通常可以使用滑动窗口(Sliding Window)的方法来解决。该问题的目标是找出一个子串,使得在这个子串中,通过最多替换 `k` 个字符后,整个子串变成由同一个字符重复构成的形式。 ### 解题思路 1. **滑动窗口法**:维护一个窗口 `[left, right]`,其中窗口内包含的字符尽量多的为同一个字符,其他字符可以通过替换 `k` 次来变成该字符。 2. **统计字符频率**:在窗口内统计当前字符的出现次数,选择出现次数最多的字符作为目标字符。 3. **窗口调整**:如果窗口长度减去最大频率字符的数量大于 `k`,说明需要替换的字符超过 `k`,此时需要将窗口左边界右移。 4. **更新最大长度**:每次窗口有效时,记录窗口的长度,并更新最大值。 ### 算法实现 以下是一个 Python 实现的例子,用于计算允许替换 `k` 个字符时的最长重复字符子串长度: ```python def characterReplacement(s: str, k: int) -> int: from collections import Counter count = Counter() left = 0 max_len = 0 max_count = 0 # 维护窗口中最多的字符出现的次数 for right in range(len(s)): count[s[right]] += 1 max_count = max(max_count, count[s[right]]) # 如果窗口长度减去最大字符出现次数大于 k,需要移动左指针 while (right - left + 1) - max_count > k: count[s[left]] -= 1 left += 1 # 更新最大长度 max_len = max(max_len, right - left + 1) return max_len ``` ### 示例 ```python s = "AABABBA" k = 1 result = characterReplacement(s, k) print(result) # 输出应为 4 ``` 在这个示例中,通过替换一个字符(将 'B' 替换为 'A'),可以将子串 `"AABABB"` 中的 `'B'` 替换为 `'A'`,从而得到最长重复字符子串 `"AAAA"`,长度为 4。 ### 复杂度分析 - **时间复杂度**:`O(n)`,其中 `n` 是字符串的长度。每个字符最多被访问两次(一次右指针,一次左指针)。 - **空间复杂度**:`O(1)`,因为字符集大小是固定的(例如字母表大小为 26)。 ### 适用场景 该算法适用于任何需要查找最长子串的问题,其中允许一定数量的字符替换,以达到目标特征(如全为同一字符)的情况。它在处理字符串优化问题时非常高效。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值