對長度為 1 到 N 的每個字首執行所述操作後,每個小寫字元的計數


在這個問題中,我們需要對每個字串字首執行給定的操作。最後,我們需要計算每個字元的頻率。

我們可以遵循貪婪演算法來解決這個問題。我們需要獲取長度為 K 的每個字首,並根據給定的條件更新其字元。我們可以使用對映來計算最終字串中字元的頻率。

問題陳述 - 我們得到了包含 N 個小寫字母字元的字串 tr。我們還得到了對映列表,其中包含總共 26 個元素。每個元素根據其值對映到小寫字元。例如,mapping[0] 對映到 'a',mapping[1] 對映到 'b',mapping[25] 對映到 'z'。此外,mapping 陣列包含 1 或 -1。

我們需要執行以下操作。

  • 獲取長度為 K 的字首中的最大字元,並從 'mapping' 陣列中獲取對映值。

  • 如果對映值為 1,則將所有字首元素增加 1。

  • 如果對映值為 -1,則將所有字首元素減少 1。

這裡,增加元素意味著 'a' -> 'b','b' -> 'c',… 'z' -> 'a'。

減少元素意味著 'a' -> 'z','b' -> 'a',… 'z' -> 'y'。

我們需要對長度為 1 <= K <= N 的每個字首執行上述操作。我們需要在執行上述操作後列印每個字元的頻率。

示例

輸入

mapping = {-1, 1, 1, -1, 1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, 1}, S = ‘progress’

輸出

0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 2 2 1 0 0 0 0 0 0 0 0

解釋

  • 在長度為 1 的字首中,最大字元是 'p',對映值為 -1。因此,更新後的字串將是 'orogress'。

  • 在長度為 2 的字首中,最大字元是 'r',對映值為 -1。因此,更新後的字串將是 'nqogress'。

  • 在長度為 3 的字首中,最大字元是 'q',對映值為 1。因此,更新後的字串是 'orpgress'。

  • 當我們完成所有操作後,最終字串將是 'pqmfpdqr',其中包含 1 個 'f',2 個 'p',2 個 'q',1 個 'm',1 個 'd' 和 1 個 'r'。在輸出中,我們列印了結果字串中每個字元的頻率。

輸入

mapping = {-1, 1, 1, -1, 1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, 1}, S = "ab", 

輸出

1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

解釋 - 執行所有操作後,最終字串為 'ac',我們列印了每個字元的頻率。

方法 1

在這種方法中,我們將遍歷字串並將 K 的值設定為等於索引 P。之後,我們將獲取長度等於 P 的字首,找到最大字元,獲取對映值,並相應地更新所有字首字元。

演算法

步驟 1 - 定義 'max_char' 變數來儲存給定字首的最大字元。

步驟 2 - 還初始化長度為 26 的列表,其值為零,用於儲存最終字串中每個字元的頻率。

步驟 3 - 開始遍歷字串,並在迴圈內將 'max_char' 變數初始化為 96。

步驟 4 - 使用巢狀迴圈從長度為 p 的字首中找到最大字元。

步驟 5 - 透過新增 max_char 的對映值來更新字首的每個字元。

步驟 7 - 如果更新後的字元小於 'a',則將其更新為 'z'。

步驟 8 - 如果更新後的字元大於 'z',則將其更新為 'a'。

步驟 9 - 最後,透過遍歷更新後的字串,將每個字元的頻率儲存在列表中。

步驟 10 - 列印字元的頻率。

示例

#include <bits/stdc++.h>
using namespace std;

void performOperations(string &str, vector<int> &mapping) {
    int len = str.length();
    char max_char;
    //  array to store the final frequency of each character
    int freq[26] = {0};
    for (int p = 0; p < len; p++) {
        max_char = 96;
        // Get the maximum character from the prefix string
        for (int q = 0; q <= p; q++) {
            max_char = max(max_char, str[q]);
        }
        // Update the prefix string by adding the max character's value.
        for (int q = 0; q <= p; q++) {
            // adding the mapping value to the current character
            str[q] += mapping[max_char - 'a'];
            // If the updated value is greater than z or less than a, update it
            if (str[q] < 'a') {
                str[q] = 'z';
            } else if (str[q] > 'z') {
                str[q] = 'a';
            }
        }
    }
    // Counting frequency of each character
    for (int p = 0; p < len; p++) {
        freq[str[p] - 'a']++;
    }
    // print count of each character in the updated string
    for (auto ch : freq) {
        cout << ch << ' ';
    }
}
int main() {
    string S = "progress";
    vector<int> mapping = {-1, 1, 1, -1, 1, 1, -1, -1,
                           -1, 1, 1, 1, -1, 1, -1, 1, -1,
                           1, -1, 1, 1, 1, -1, 1, 1, 1};
    performOperations(S, mapping);
    return 0;
}

輸出

0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 2 2 1 0 0 0 0 0 0 0 0

時間複雜度 - O(N*N),因為我們使用兩個巢狀迴圈遍歷字串。

空間複雜度 - O(1),因為我們使用常量空間來儲存字元的頻率。

結論

我們對輸入字串執行了給定的操作,並在輸出中列印了更新後字串的字元頻率。程式設計師也可以使用 C++ 中的對映來儲存字元頻率,而不是使用列表。為了更多練習,程式設計師可以嘗試列印更新字串中每個字元的累積頻率。

更新於:2023年8月14日

54 次檢視

開啟您的 職業生涯

完成課程獲得認證

開始
廣告