Maison > développement back-end > C++ > La sous-séquence la plus longue dont les caractères sont les mêmes que la sous-chaîne et dont la différence de fréquence est d'au plus K

La sous-séquence la plus longue dont les caractères sont les mêmes que la sous-chaîne et dont la différence de fréquence est d'au plus K

王林
Libérer: 2023-09-09 09:09:09
avant
1292 Les gens l'ont consulté

La sous-séquence la plus longue dont les caractères sont les mêmes que la sous-chaîne et dont la différence de fréquence est dau plus K

Dans ce problème, nous trouverons la longueur maximale de la sous-séquence telle qu'elle contienne des caractères consécutifs et que la différence de fréquence de tous les caractères ne dépasse pas K.

Nous devons trouver toutes les sous-séquences possibles d'une chaîne donnée et vérifier si elle contient chaque caractère consécutivement et avec une différence de fréquence maximale pour obtenir le résultat.

Énoncé du problème- Nous recevons une chaîne alpha contenant des caractères alphabétiques minuscules. De plus, on nous a donné un entier positif K. Nous devons trouver la longueur maximale d’une sous-séquence d’une chaîne donnée telle qu’elle suive les règles suivantes.

  • Toutes les occurrences d'un caractère spécifique doivent être consécutives.

  • La différence de fréquence des caractères ne peut pas être supérieure à K.

Exemple

Entrez

alpha = "ppppqrs", K = 2
Copier après la connexion

Sortie

6
Copier après la connexion

Explication - On peut prendre la sous-séquence "pppqrs". La fréquence maximale des caractères est de 3 et la fréquence minimale des caractères est de 1. La différence est donc de 2. Et il contient tous les caractères consécutivement.

Entrez

alpha = "abbbbc", K = 2
Copier après la connexion

Sortie

5
Copier après la connexion

Explication - On peut prendre la sous-séquence "abbbc".

Entrez

alpha = "mnnnnnnno", k = 3;
Copier après la connexion

Sortie

7
Copier après la connexion

Explication - On peut prendre la sous-séquence "nnnnnnn".

Méthode 1

Dans cette méthode, nous utiliserons une fonction récursive pour trouver toutes les sous-séquences d'une longueur donnée. De plus, nous définirons des fonctions pour vérifier si une sous-séquence contient tous les caractères consécutivement. Nous utiliserons la structure des données cartographiques pour calculer les différences de fréquence maximales et minimales.

Algorithme

Étape 1 - Définissez la carte "f" pour stocker la fréquence des caractères.

Étape 2 - Si start est égal à la longueur de la chaîne temporaire et que la longueur de la chaîne est supérieure à 0, suivez ces étapes.

Étape 3 - Initialisez les variables "minf" et "maxf" pour stocker les fréquences minimales et maximales.

Étape 4- Effacez la carte et stockez la fréquence de chaque personnage dans la carte.

Étape 5 - Parcourez les valeurs de la carte et recherchez les valeurs de fréquence maximale et minimale.

Étape 6 - Si la différence de fréquence maximale et minimale est inférieure ou égale à K, vérifiez si la chaîne contient des caractères consécutifs.

Étape 6.1 - Dans la fonction checkForContinously(), définissez la carte "pos" pour stocker la dernière position d'un caractère spécifique.

Étape 6.2 - Faites une boucle sur la ficelle. Si le caractère actuel existe dans la carte et que la différence entre la position actuelle du personnage et sa dernière position est inférieure à 1, mettez à jour la dernière position. Sinon, renvoie faux.

Étape 6.3 - Ajoutez le personnage à la carte s'il n'existe pas.

Étape 6.4 - Enfin, retournez vrai.

Étape 7 - Si la chaîne contient des caractères consécutifs et que la différence de fréquence est inférieure à K, mettez à jour la valeur de 'maxi' si la valeur de 'maxi' est inférieure à la longueur de la sous-séquence actuelle.

Étape 8 - Effectuez un appel récursif après avoir exclu le personnage actuel.

Étape 9 - Ajoutez le caractère actuel à la fin de la chaîne temporaire. Effectuez également un appel récursif avec la chaîne "tmp" mise à jour.

Exemple

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

int maxi = 0;
// Check for continuous characters in the substring
bool CheckForContinuous(string &tmp) {
    // map to store the last index of the character
    unordered_map<char, int> pos;
    for (int p = 0; p < tmp.length(); p++) {
        // When the last index exists in the map
        if (pos[tmp[p]]) {
            // If the last index is adjacent to the current index
            if (p - pos[tmp[p]] + 1 <= 1)
                pos[tmp[p]] = p + 1;
            else
                return false;
        } else {
            // When the map doesn't have a character as a key
            pos[tmp[p]] = p + 1;
        }
    }
    return true;
}
void getLongestSubSeq(string &alpha, string tmp, int start, int &k) {
    // To store the character's frequency
    unordered_map<char, int> f;
    if (start == alpha.length()) {
        if (tmp.length() > 0) {
            // To store minimum and maximum frequency of characters
            int minf = INT_MAX, maxf = INT_MIN;
            // Make map empty
            f.clear();
            // Store frequency of characters in the map
            for (int p = 0; p < tmp.length(); p++)
                f[tmp[p]]++;

            // Get minimum and maximum value from the map
            for (auto &key : f) {
                minf = min(minf, key.second);
                maxf = max(maxf, key.second);
            }
            // Validate substring for frequency difference and continuous characters
            if (maxf - minf <= k && CheckForContinuous(tmp))
                maxi = max(maxi, (int)tmp.length());
        }
        return;
    }
    // Exclude current character
    getLongestSubSeq(alpha, tmp, start + 1, k);
    // Include current character
    tmp.push_back(alpha[start]);
    getLongestSubSeq(alpha, tmp, start + 1, k);
}
int main() {
    string alpha = "ppppqrs", tmp;
    int k = 2;
    getLongestSubSeq(alpha, tmp, 0, k);
    cout <<"The maximum length of the substring according to the given conditions is " << maxi;
    return 0;
}
Copier après la connexion

Sortie

The maximum length of the substring according to the given conditions is 6
Copier après la connexion

Complexité temporelle - O(N*2N), où O(N) pour vérifier les caractères consécutifs et O(2N) pour trouver toutes les sous-séquences.

Complexité spatiale - O(N) pour stocker la sous-séquence temporaire.

Nous utilisons une méthode simple pour trouver toutes les sous-séquences d'une chaîne donnée. Cependant, cela prend beaucoup de temps. Il n'est pas recommandé d'utiliser cette méthode pour résoudre le problème des grandes chaînes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:tutorialspoint.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal