在字串中透過 K 次遞增操作,最大化僅包含單個不同字元的子序列的長度


在這個問題中,我們需要找到透過最多增加k次多個字元來獲得包含單個字元的最長子序列。

我們可以使用滑動視窗方法來解決這個問題。在對字串進行排序後,我們可以找到任何視窗的最大長度以獲得結果。

問題陳述 – 我們給定一個包含小寫字母字元的字串 str。此外,我們還給定了正整數 k。在對給定字串的多個字元執行最多 k 次遞增操作後,我們需要找到包含單個字元的最長子序列的長度。

示例

輸入– str = "acccdera", k = 5

輸出– 5

解釋– 我們可以將 'a' 的值增加到 'c',這需要 4 次遞增操作。因此,結果字串將為 'ccccderc',其中包含長度為 5 的 'c' 子序列。

輸入– str = ‘agkt’, k = 1

輸出– 1

解釋– 我們需要選擇任何單個字元作為子序列,因為我們無法透過將任何字元增加 1 來獲得多個相同的數字。

輸入– str = ‘hijjjkdfr’, k = 3

輸出– 5

解釋– 我們可以將 'h' 增加 2,將 'i' 增加 1。因此,結果字串將為 'jjjjjkdfr',其中包含 5 個 'j'。

方法 1

在這種方法中,首先,我們將對字串進行排序。由於我們需要找到單個字元的子序列長度,因此在對字串進行排序後,使用滑動視窗方法將變得更容易。

演算法

  • 將字串的長度儲存在 'len' 變數中。

  • 使用 sort() 方法對字串進行排序。

  • 將 'start' 和 'end' 變數初始化為零,作為滑動視窗指標。還將 'max_len' 初始化為零以儲存子序列的最大長度,並將 'sum' 初始化為零以儲存所有滑動視窗字元的總和。

  • 開始遍歷排序後的字串。

  • 將當前字元的 ASCII 值新增到 sum 中。

  • 使用 while 迴圈進行迭代,直到 sum + K < (str[end] - 'a') * (end - start + 1) 為真。這裡,'(str[end] - 'a') * (end - start + 1)' 表示字元值乘以滑動視窗的大小。

  • 在迴圈中,減去起始位置字元的字元值。同時,將 start 的值增加 1。

  • 在 max_len 變數中,儲存 max_len 和 end - start + 1(滑動視窗大小)中的最大值。

  • 返回 max_len 值。

示例

#include <bits/stdc++.h>
using namespace std;
// function to find the maximum length of the subsequence such that we get it after at most k increment operations
int getSubSeqLen(string str, int K){
   // Store the size of str
   int len = str.length();
   // Sort the given string
   sort(str.begin(), str.end());
   // variables for sliding window
   int start = 0, end = 0;
   // to store the maximum length of subsequence and the sum of ASCII values of characters in the sliding window.
   int max_len = 0, sum = 0;
   // Traverse the string str
   for (end = 0; end < len; end++){
      // Add the ASCII value of the current character in the sum
      sum = sum + (str[end] - 'a');
      // Decrease the window size by removing the leftmost characters
      while (sum + K < (str[end] - 'a') * (end - start + 1)){
          // remove the leftmost character from the sum
          sum = sum - (str[start] - 'a');
          // Increase the start index
          start++;
      }
      // Update the maximum length according to the current window size
      max_len = max(max_len, end - start + 1);
   }
   // return the maximum length of the subsequence
   return max_len;
}
int main(){
   string str = "acccdera";
   int K = 5;
   cout << "The maximum length of the subsequence of the same character after performing at most k operations is " << getSubSeqLen(str, K);
   return 0;
}

輸出

The maximum length of the subsequence of the same character after performing at most k operations is 5

時間複雜度 – O(N*logN + N) ~ O(N*logN)。這裡,排序函式的時間複雜度為 O(NlogN),滑動視窗方法的時間複雜度為 O(N)。

空間複雜度 – O(1),因為我們沒有使用任何額外的空間。

在上面的程式碼中,我們找到了包含不同字元的視窗,並且可以透過執行總共最多 k 次遞增操作將其更改為與視窗的最後一個字元相同。之後,我們使用滑動視窗方法找到此類視窗的最大長度。

更新於: 2023年8月18日

144 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.