Time Cost

21min53s

Code

  • My Solution
    class Solution {
    public:
      int characterReplacement(string s, int k) {
          int base = 1, ceil = s.length();
          int window = (base + ceil) / 2, result = 0;
    
          vector<vector<int>> counts(s.length() + 1, vector<int>(26, 0));
    
          for (int i=0; i<s.length(); i++) {
              counts[i + 1] = counts[i];
              counts[i + 1][s[i] - 'A']++;
          }
    
          bool isqualified = false;
    
          while (base <= ceil) {
              for (int i=0; i<=s.length()-window; i++) {
                  // start: i+1, end:i+window
                  int max_letter = 0;
                  vector<int> cur = vector_sub(counts[i+window], counts[i]);
                  for (int num: cur) {
                      max_letter = std::max(max_letter, num);
                  }
                  if (window - max_letter <= k) {
                      // qualified
                      result = window;
                      isqualified = true;
                      base = window + 1;
                      window = (base + ceil) / 2;
                      break;
                  }
              }
              if (!isqualified) {
                  ceil = window - 1;
                  window = (base + ceil) / 2;
              }
              isqualified = false;
          }
    
          return result;
      }
    
      // a-b
      vector<int> vector_sub(vector<int> a, vector<int> b) {
          vector<int> result;
          for (int i=0; i<a.size(); i++) {
              result.push_back(a[i] - b[i]);
          }
          return result;
      }
    };
    
  • Good Solution
    class Solution {
    public:
      int characterReplacement(string s, int k) {
          int h[26] = {0};
          int l = 0;
          int maxf = 0;   
          int ans = 0;
    
          for (int r = 0; r < (int)s.size(); r++) {
              int idx = s[r] - 'A';
              h[idx]++;
              maxf = max(maxf, h[idx]);
              while (r - l + 1 - maxf > k) {
                  h[s[l] - 'A']--;
                  l++;
              }
              ans = max(ans, r - l + 1);
          }
          return ans;
      }
    };