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

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

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

示例 1

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

首先想了一个二分查找的方法,主要就是先确定一下结果的区间,在区间内去查找有没有合适的字符串片段,但是这个方法面对k = 0的时候就完蛋了,主要是因为min_result不会再像上更新了。代码如下

class Solution(object):

    def MaxRepeat(self, s):
        # 找到字符串s中,最长的重复字母的次数

        letter_dict = {}

        for letter in s:
            if letter in letter_dict.keys():
                letter_dict[letter] += 1
            else:
                letter_dict[letter] = 1

        value_sort = list(letter_dict.values())
        value_sort.sort()

        return value_sort[-1]

    def characterReplacement(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: int
        """

        min_len = k
        max_len = self.MaxRepeat(s) + k
        if max_len > len(s):
            max_len = len(s)

        result_len = int((min_len + max_len) / 2)

        while True:

            flag = True
            for start in range(len(s) - result_len):
                candid = s[start: start + result_len]

                min_result = self.MaxRepeat(candid) + k
                if min_result > len(s):
                    min_result = len(s)

                if min_result > result_len:
                    min_len = min_result
                    flag = False
                    break
                elif min_result == result_len:
                    min_len = min_result
                    break

            if flag:
                max_len = result_len


            result_len = int((min_len + max_len) / 2)

            if max_len == min_len:
                break

        return result_len

后来发现用滑动窗口是个好办法,代码如下

class Solution(object):

    def characterReplacement(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: int
        """

        MaxRepeat = 0
        result = 0
        left = 0
        letter_dict = {}

        for right in range(len(s)):

            if s[right] in letter_dict.keys():
                letter_dict[s[right]] += 1
            else:
                letter_dict[s[right]] = 1

            MaxRepeat = max(MaxRepeat, letter_dict[s[right]])

            while (right - left + 1) - MaxRepeat > k:
                letter_dict[s[left]] -= 1
                left += 1

            result = max(result, (right - left + 1))

        return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于您的问题,您可以使用滑动窗口的方法来解决。具体步骤如下: 1. 初始化一个字典freq,用于记录字符串中每个字符出现的次数。 2. 定义左指针left和右指针right,初始化为0。 3. 定义变量maxLen,用于记录最长重复字母组成子串的长度。 4. 进入循环,循环条件是右指针小于字符串长度。 - 将右指针所指的字符加入字典freq,并更新该字符的出现次数。 - 如果当前窗口内不满足重复字母个数不超过k个的条件,即right - left + 1 - max(freq.values()) > k,说明窗口内需要替换字符超过了k个。 - 将左指针所指的字符从字典freq中减去,并更新该字符的出现次数。 - 左指针右移一位。 - 更新最长子串长度maxLen,即max(maxLen, right - left + 1)。 - 右指针右移一位。 5. 返回最长子串长度maxLen。 以下是一个示例的C++代码实现: ```cpp #include <iostream> #include <unordered_map> #include <algorithm> using namespace std; int longestSubstring(string s, int k) { unordered_map<char, int> freq; int left = 0, right = 0; int maxLen = 0; while (right < s.length()) { freq[s[right]]++; if (right - left + 1 - max_element(freq.begin(), freq.end(), [](const auto& a, const auto& b) { return a.second < b.second; })->second > k) { freq[s[left]]--; left++; } maxLen = max(maxLen, right - left + 1); right++; } return maxLen; } int main() { int n, k; cin >> n; string s; cin >> s; cin >> k; int result = longestSubstring(s, k); cout << result << endl; return 0; } ``` 希望能帮助到您!如有任何疑问,请随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值