


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"));
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 3 − str = "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 deApproche 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; }
Sortie
Repeated subsequence of length 2 or more: Yes
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; }
Sortie
Repeated subsequence of length 2 or more: Yes
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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

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

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.

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 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

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)

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

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
