Table des matières
Approche par force brute
Sous-séquence commune la plus longue modifiée (LCS)
Exemple
Sortie
Solution améliorée
Conclusion
Maison développement back-end C++ Programme C++ pour déterminer si une chaîne donnée a une sous-séquence répétitive de longueur 2 ou plus

Programme C++ pour déterminer si une chaîne donnée a une sous-séquence répétitive de longueur 2 ou plus

Sep 17, 2023 pm 02:41 PM
c程序 查找 répéter la sous-séquence

Programme C++ pour déterminer si une chaîne donnée a une sous-séquence répétitive de longueur 2 ou plus

Étant donné une chaîne, trouvez une sous-séquence de longueur au moins deux qui est répétée dans la chaîne. Les indices des numéros d'éléments de sous-séquence ne peuvent pas être dans le même ordre.

string s = "PNDPNSP";
print("Repeated subsequence of length 2 or more: ", (check(s) ? "Yes" : "No"));
Copier après la connexion

Regardons quelques exemples ci-dessous pour comprendre comment cette approche fonctionne dans différentes situations -

Exemple 1 - str = "PNDPNSP"

Explication − Ici, la réponse est vraie car il y a une sous-séquence récurrente "PN" dans la chaîne.

Exemple 2 - str = "PPND"

Explication - Ici, la réponse est fausse car il n'y a pas de sous-séquence répétée de longueur au moins deux dans la chaîne.

Exemple 3str = "PPNP"

Explication - Ici, la réponse est correcte car les index "PP" 0 et 1 et les index "PP" 1 et 3 existent et les "PP" utilisés ont des index différents séquentiellement dans la sous-séquence. (indice basé sur 0)

La traduction chinoise de

Approche par force brute

est :

Approche par force brute

Cette méthode générera toutes les sous-séquences possibles de longueur 2 (longueur minimale) et déterminera si nous avons déjà vu cette sous-séquence avec la sous-séquence trouvée. Si la sous-séquence existe déjà, nous renvoyons vrai et terminons le programme ; sinon, après avoir terminé l'itération, si nous ne trouvons rien, nous renvoyons faux.

Dans le pire des cas, cette sous-séquence peut ne pas exister et nous finissons par générer tous les résultats possibles.

sous-séquences de deux longueurs et les stocker. Donc, en supposant que vous hachez la sous-séquence calculée pour réaliser l'insertion et la recherche O(1), cela devient O(n^2). La sous-séquence totale est également O(n^2), donc l'espace de stockage l'est également.

Sous-séquence commune la plus longue modifiée (LCS)

L'algorithme LCS trouve la sous-séquence commune la plus longue dans 2 chaînes. Il s'agit d'une méthode de programmation dynamique standard qui utilise une méthode itérative de matrices bidimensionnelles. La complexité temporelle est O(n^2). Nous rechercherons uniquement la chaîne donnée elle-même dans la méthode modifiée. Néanmoins, nous vérifierons également si l'index de la position actuelle n'est pas le même.

Exemple

Consultez le code C++ ci-dessous pour implémenter l'algorithme de sous-séquence commune la plus longue modifiée qui aide notre méthode à trouver des sous-séquences répétitives de longueur 2 ou plus -

#include <iostream>
using namespace std;
bool modifiedLongestCommonSubsequence(string s) {
   int n = s.length();
   int dp[n+1][n+1];
   for (int i=0; i<=n; i++)
      fill(dp[i], dp[i]+n+1, 0);
   for (int i=1; i<=n; i++) {
      for (int j=1; j<=n; j++) {
         if (s[i-1]==s[j-1] && i!=j) {
            dp[i][j] = 1 + dp[i-1][j-1];
         }
         else {
            dp[i][j] = max(dp[i][j-1], dp[i-1][j]);
         }
      }
   }
   if(dp[n][n] > 1) return true;
   return false;
}
int main() {
   string str = "PNDPNSP";
   cout << "Repeated subsequence of length 2 or more: " << (modifiedLongestCommonSubsequence(str) ? "Yes" : "No");
   return 0;
}
Copier après la connexion

Sortie

Repeated subsequence of length 2 or more: Yes
Copier après la connexion
Copier après la connexion

Bien sûr, la complexité temporelle et spatiale est O(n^2), mais en regardant la première méthode, elle est plus élégante et produit facilement un hachage de O(1).

Solution améliorée

Dans cette méthode, nous essaierons de faire quelques observations basées sur la méthode précédente.

Observation 1 − Si un caractère apparaît plus de deux fois, la réponse est toujours vraie. Voyons pourquoi ?

Exemple - Dans la chaîne str = "AVHJFBABVNHFA" nous avons "AAA" aux positions 0, 6 et 12. donc On peut avoir "AA" aux index 0 et 6 comme sous-séquence, et "AA" aux index 6 et 12 comme sous-séquence comme un autre.

Observation 2 - Si un caractère n'est répété qu'une seule fois, il ne peut pas contribuer à nos résultats sous-séquence, car il ne sera disponible que dans au plus une sous-séquence. ça ne marchera pas Parce que nous avons besoin d'au moins deux sous-séquences. Nous pouvons donc supprimer ou ignorer tous les caractères arrivé en même temps.

Observation 3 − Si une chaîne est un palindrome et que les deux premières observations s'appliquent, alors la réponse est Toujours faux sauf si la longueur de la chaîne est impaire. Voyons pourquoi ?

Exemple - String str = "PNDDNP"

Explication - Maintenant, les personnages ne sont pas dans l'ordre donc on ne les retrouve jamais Les sous-séquences ont le même ordre, ce n’est donc pas possible.

Exemple

Sur la base des trois observations ci-dessus, nous concluons que si nous supprimons tous les caractères qui apparaissent une fois dans la chaîne et vérifions ensuite si un certain caractère apparaît plus de deux fois ou si la chaîne n'est pas un palindrome, alors notre réponse est correcte. Voyons la solution améliorée implémentée en C++ -

#include <iostream>
using namespace std;
bool isPalindrome(string s) {
   for(int i=0;i<s.size()/2;i++) {
      if(s[i]!=s[s.size()-1-i]) {
         return false;
      }
   }
   return true;
}
bool check(string s) {
   int hash[26] = {0};
   for (int i = 0; i < s.size(); i++) {
      hash[s[i]-'a']++;
      if (hash[s[i]-'a'] > 2) {
         return true;
      }
   }
   int k = 0;
   string mstr = "";
   for (int i = 0; i < s.size(); i++) {
      if (hash[s[i]-'a'] > 1) {
         mstr[k++] = s[i];
      }
   }
   if (isPalindrome(mstr)) {
      return false;
   }
   return true;
}
int main() {
   string s = "PNDPNSP";
   cout << "Repeated subsequence of length 2 or more: " << (check(s) ? "Yes" : "No");
   return 0;
}
Copier après la connexion

Sortie

Repeated subsequence of length 2 or more: Yes
Copier après la connexion
Copier après la connexion

Conclusion

Nous avons conclu que l'utilisation d'observations et de hachages est le meilleur moyen de résoudre ce problème. La complexité temporelle est O(n). La complexité spatiale est également de l'ordre de O(n), créant une nouvelle chaîne et un hachage constant de 26 caractères.

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment désactiver Localiser mon iPhone Comment désactiver Localiser mon iPhone Nov 09, 2023 pm 02:21 PM

Que se passe-t-il lorsque vous désactivez Find My sur iPhone ? Find My iPhone vous aide à localiser un appareil perdu ou volé. Lorsqu'il est activé, Localiser mon iPhone vous permet de suivre l'emplacement de votre appareil sur une carte, d'émettre des sons et de vous aider à trouver votre appareil. Find My comprend également un verrouillage d'activation pour empêcher quiconque d'utiliser votre iPhone. Lorsque vous désactivez Localiser mon iPhone, vous perdez toutes ces fonctionnalités, ce qui peut rendre difficile la récupération d'un appareil Apple perdu. Bien que Localiser mon iPhone soit très utile, vous devez le désactiver lorsque vous souhaitez vendre, faire un don, échanger votre téléphone ou l'envoyer pour un remplacement de batterie ou tout autre service. Cela garantira que personne ne puisse accéder aux informations vous concernant

4 façons de désactiver Find My sur iPhone 4 façons de désactiver Find My sur iPhone Feb 02, 2024 pm 04:15 PM

L'application Find My d'Apple vous permet de localiser votre iPhone ou autre appareil pour éviter qu'il ne soit perdu ou oublié. Bien que Find My soit un outil utile pour suivre les appareils, vous souhaiterez peut-être le désactiver si vous êtes préoccupé par des problèmes de confidentialité, si vous ne voulez pas vider votre batterie ou pour d'autres raisons. Heureusement, il existe plusieurs façons de désactiver Find My sur iPhone, que nous expliquerons toutes dans cet article. Comment désactiver Find My sur iPhone [4 méthodes] Vous pouvez désactiver Find My sur iPhone de quatre manières. Si vous avez utilisé la méthode 1 pour désactiver Find, vous pouvez le faire à partir de l'appareil sur lequel vous souhaitez le désactiver. Pour continuer avec les méthodes 2, 3 et 4, l'iPhone que vous souhaitez éteindre Find Your Phone doit être éteint ou

Recherchez l'index d'un élément dans un tableau à l'aide de la fonction Array.IndexOf en C# Recherchez l'index d'un élément dans un tableau à l'aide de la fonction Array.IndexOf en C# Nov 18, 2023 am 09:59 AM

Utilisez la fonction Array.IndexOf en C# pour trouver l'index d'un élément dans un tableau. Dans un programme C#, lorsque nous avons besoin de trouver l'index d'un élément dans un tableau, nous pouvons utiliser la fonction Array.IndexOf. La fonction Array.IndexOf recherche l'élément spécifié dans la plage de tableau spécifiée et renvoie l'index de sa première occurrence. Si l'élément n'est pas trouvé, -1 est renvoyé. Voici un exemple de code qui montre comment utiliser la fonction Array.IndexOf pour rechercher un élément dans un tableau.

Comment vérifier le numéro de série du disque dur et l'adresse Mac Comment vérifier le numéro de série du disque dur et l'adresse Mac Feb 18, 2024 pm 07:45 PM

Les numéros de série des disques durs et les adresses MAC sont des identifiants importants dans le matériel informatique et sont très utiles dans la gestion et la maintenance des systèmes informatiques. Cet article explique comment trouver le numéro de série du disque dur et l'adresse MAC. 1. Recherchez le numéro de série du disque dur Le numéro de série du disque dur est un identifiant unique utilisé par le fabricant du disque dur pour identifier et suivre le disque dur. Dans différents systèmes d'exploitation, la méthode de recherche du numéro de série du disque dur est légèrement différente. Windows : ouvrez l'invite de commande (recherchez "cmd" dans le menu Démarrer), entrez la commande suivante et appuyez sur Entrée : wmicdisk

La fonction glob() en PHP est utilisée pour rechercher des fichiers ou des répertoires La fonction glob() en PHP est utilisée pour rechercher des fichiers ou des répertoires Nov 18, 2023 pm 06:17 PM

La fonction glob() en PHP est utilisée pour rechercher des fichiers ou des répertoires et constitue une puissante fonction d'opération de fichiers. Il peut renvoyer le chemin d'un fichier ou d'un répertoire en fonction d'une correspondance de modèle spécifiée. La syntaxe de la fonction glob() est la suivante : glob(pattern, flags) où pattern représente la chaîne de modèle à rechercher, qui peut être une expression générique, telle que *.txt (fichiers correspondants se terminant par .txt), ou un chemin de fichier spécifique. flags est un paramètre facultatif utilisé pour contrôler la fonction

Programme C++ pour trouver la valeur de la fonction sinus hyperbolique inverse en prenant une valeur donnée comme argument Programme C++ pour trouver la valeur de la fonction sinus hyperbolique inverse en prenant une valeur donnée comme argument Sep 17, 2023 am 10:49 AM

Les fonctions hyperboliques sont définies à l'aide d'hyperboles au lieu de cercles et sont équivalentes aux fonctions trigonométriques ordinaires. Il renvoie le paramètre de rapport dans la fonction sinus hyperbolique à partir de l'angle fourni en radians. Mais faites le contraire, ou en d’autres termes. Si nous voulons calculer un angle à partir d’un sinus hyperbolique, nous avons besoin d’une opération trigonométrique hyperbolique inverse comme l’opération sinus hyperbolique inverse. Ce cours montrera comment utiliser la fonction sinus hyperbolique inverse (asinh) en C++ pour calculer des angles en utilisant la valeur du sinus hyperbolique en radians. L'opération arc sinus hyperbolique suit la formule suivante -$$\mathrm{sinh^{-1}x\:=\:In(x\:+\:\sqrt{x^2\:+\:1})}, Où\:In\:is\:logarithme naturel\:(log_e\:k)

Programme C++ pour imprimer le dictionnaire Programme C++ pour imprimer le dictionnaire Sep 11, 2023 am 10:33 AM

Une carte est un type spécial de conteneur en C++ où chaque élément est une paire de deux valeurs, à savoir une valeur clé et une valeur mappée. La valeur clé est utilisée pour indexer chaque élément et la valeur mappée est la valeur associée à la clé. Que la valeur mappée soit unique ou non, la clé est toujours unique. Pour imprimer des éléments de carte en C++, nous devons utiliser un itérateur. Un élément dans un ensemble d’éléments est indiqué par un objet itérateur. Les itérateurs sont principalement utilisés avec des tableaux et d'autres types de conteneurs (tels que des vecteurs), et ils disposent d'un ensemble spécifique d'opérations qui peuvent être utilisées pour identifier des éléments spécifiques dans une plage spécifique. Les itérateurs peuvent être incrémentés ou décrémentés pour référencer différents éléments présents dans une plage ou un conteneur. L'itérateur pointe vers l'emplacement mémoire d'un élément spécifique dans la plage. Imprimer une carte en C++ à l'aide d'itérateurs Voyons d'abord comment définir

Le programme C utilise la fonction rename() pour changer le nom du fichier Le programme C utilise la fonction rename() pour changer le nom du fichier Sep 21, 2023 pm 10:01 PM

La fonction renommer modifie un fichier ou un répertoire de son ancien nom à son nouveau nom. Cette opération est similaire à l’opération de déplacement. Nous pouvons donc également utiliser cette fonction de renommage pour déplacer des fichiers. Cette fonction existe dans le fichier d'en-tête de la bibliothèque stdio.h. La syntaxe de la fonction rename est la suivante : intrename(constchar*oldname,constchar*newname); La fonction rename() accepte deux paramètres. L’un est l’ancien nom et l’autre le nouveau nom. Les deux paramètres sont des pointeurs vers des caractères constants qui définissent l'ancien et le nouveau nom du fichier. Renvoie zéro si le fichier a été renommé avec succès ; sinon, renvoie un entier différent de zéro. Lors d'une opération de changement de nom

See all articles