


C++-Programm, um herauszufinden, ob eine bestimmte Zeichenfolge eine sich wiederholende Teilsequenz mit einer Länge von 2 oder mehr hat
Suchen Sie bei einer gegebenen Zeichenfolge eine Teilfolge mit einer Länge von mindestens zwei, die in der Zeichenfolge wiederholt wird. Die Indizes der Teilsequenzelementnummern können nicht in derselben Reihenfolge sein.
string s = "PNDPNSP"; print("Repeated subsequence of length 2 or more: ", (check(s) ? "Yes" : "No"));
Sehen wir uns unten ein paar Beispiele an, um zu verstehen, wie dieser Ansatz in verschiedenen Situationen funktioniert -
Beispiel 1 - str = "PNDPNSP"
Erläuterung − Hier ist die Antwort wahr, da die Zeichenfolge eine wiederkehrende Teilsequenz „PN“ enthält.
Beispiel 2 - str = "PPND"
Erklärung – Hier ist die Antwort falsch, da es in der Zeichenfolge keine wiederholte Teilfolge mit einer Länge von mindestens zwei gibt.
Beispiel 3 − str = "PPNP"
Erklärung - Hier ist die Antwort richtig, da die „PP“-Indizes 0 und 1 sowie die „PP“-Indizes 1 und 3 existieren und die verwendeten „PP“ in der Teilsequenz nacheinander unterschiedliche Indizes haben. (0-basierter Index)
Die chinesische Übersetzung vonBrute-Force-Ansatz
lautet:Brute-Force-Ansatz
Diese Methode generiert alle möglichen Teilsequenzen der Länge 2 (Mindestlänge) und stellt fest, ob wir diese Teilsequenz bereits mit der gefundenen Teilsequenz gesehen haben. Wenn die Teilsequenz bereits existiert, geben wir „true“ zurück und beenden das Programm; andernfalls geben wir nach Abschluss der Iteration „false“ zurück, wenn wir nichts gefunden haben.
Im schlimmsten Fall existiert diese Teilsequenz möglicherweise nicht und wir generieren am Ende alle möglichen Ergebnisse.
Teilfolgen zweier Längen berechnen und speichern. Angenommen, Sie hashen die berechnete Teilsequenz, um die Einfügung und Suche von O(1) zu erreichen, dann wird daraus O(n^2). Die gesamte Teilfolge ist ebenfalls O(n^2), also ist es auch der Speicherplatz.Modifizierte längste gemeinsame Teilsequenz (LCS)
LCS-Algorithmus findet die längste gemeinsame Teilsequenz in 2 Strings. Es handelt sich um eine standardmäßige dynamische Programmiermethode, die eine iterative Methode zweidimensionaler Matrizen verwendet. Die Zeitkomplexität beträgt O(n^2). Wir werden in der geänderten Methode nur nach der angegebenen Zeichenfolge selbst suchen. Dennoch prüfen wir auch, ob der Index der aktuellen Position nicht derselbe ist.
Beispiel
Schauen Sie sich den folgenden C++-Code an, um den modifizierten Algorithmus für die längste gemeinsame Teilsequenz zu implementieren, der unserer Methode dabei hilft, sich wiederholende Teilsequenzen mit einer Länge von 2 oder mehr zu finden -
#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; }
Ausgabe
Repeated subsequence of length 2 or more: Yes
Natürlich ist die zeitliche und räumliche Komplexität O(n^2), aber wenn man sich die erste Methode ansieht, ist sie eleganter und erzeugt leicht einen Hash von O(1).
Verbesserte Lösung
In dieser Methode werden wir versuchen, einige Beobachtungen basierend auf der vorherigen Methode zu machen.
Beobachtung 1 − Wenn ein Zeichen mehr als zweimal vorkommt, ist die Antwort immer wahr. Mal sehen, warum?
Beispiel – In der Zeichenfolge str = „AVHJFBABVNHFA“ haben wir „AAA“ an den Positionen 0, 6 und 12. Also Wir können „AA“ bei Index 0 und 6 als Teilsequenz und „AA“ bei Index 6 und 12 als Teilsequenz haben als ein anderer.
Beobachtung 2 – Wenn ein Zeichen nur einmal wiederholt wird, kann es nicht zu unseren Ergebnissen beitragen Teilsequenz, da es nur in höchstens einer Teilsequenz verfügbar sein wird. es wird nicht funktionieren Weil wir mindestens zwei Teilfolgen brauchen. Wir können also alle Zeichen entfernen oder ignorieren geschah gleichzeitig.
Beobachtung 3 − Wenn eine Zeichenfolge ein Palindrom ist und die ersten beiden Beobachtungen zutreffen, dann lautet die Antwort Immer falsch, es sei denn, die Zeichenfolgenlänge ist ungerade. Mal sehen, warum?
Beispiel – String str = „PNDDNP“
Erklärung – Nun, die Zeichen sind nicht in der richtigen Reihenfolge, sodass wir sie nie finden können Die Teilsequenzen haben die gleiche Reihenfolge, daher ist dies nicht möglich.
Beispiel
Basierend auf allen drei oben genannten Beobachtungen kommen wir zu dem Schluss, dass unsere Antwort richtig ist, wenn wir alle Zeichen entfernen, die einmal in der Zeichenfolge vorkommen, und dann prüfen, ob ein bestimmtes Zeichen mehr als zweimal vorkommt oder ob die Zeichenfolge kein Palindrom ist. Sehen wir uns die verbesserte Lösung an, die in C++ implementiert wurde -
#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; }
Ausgabe
Repeated subsequence of length 2 or more: Yes
Fazit
Wir kamen zu dem Schluss, dass die Verwendung von Beobachtungen und Hashes der beste Weg ist, dieses Problem zu lösen. Die Zeitkomplexität beträgt O(n). Die Raumkomplexität liegt ebenfalls in der Größenordnung von O(n), wodurch eine neue Zeichenfolge und ein konstanter 26-Zeichen-Hash erstellt werden.
Das obige ist der detaillierte Inhalt vonC++-Programm, um herauszufinden, ob eine bestimmte Zeichenfolge eine sich wiederholende Teilsequenz mit einer Länge von 2 oder mehr hat. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Was passiert, wenn Sie Find My auf dem iPhone deaktivieren? „Mein iPhone suchen“ hilft Ihnen, ein verlorenes oder gestohlenes Gerät zu finden. Wenn die Funktion „Mein iPhone suchen“ aktiviert ist, können Sie den Standort Ihres Geräts auf einer Karte verfolgen, Töne abspielen und Ihnen bei der Suche nach Ihrem Gerät helfen. Find My verfügt außerdem über eine Aktivierungssperre, um zu verhindern, dass jemand Ihr iPhone verwendet. Wenn Sie „Mein iPhone suchen“ deaktivieren, gehen alle diese Funktionen verloren, was die Wiederherstellung eines verlorenen Apple-Geräts erschweren kann. Obwohl Find My iPhone sehr nützlich ist, sollten Sie es deaktivieren, wenn Sie Ihr Telefon verkaufen, spenden, eintauschen oder zum Batteriewechsel oder für einen anderen Service einsenden möchten. Dadurch wird sichergestellt, dass niemand auf Informationen über Sie zugreifen kann

Mit der Find My-App von Apple können Sie Ihr iPhone oder ein anderes Gerät orten, um zu verhindern, dass es verloren geht oder vergessen wird. Obwohl Find My ein nützliches Tool zum Verfolgen von Geräten ist, möchten Sie es möglicherweise deaktivieren, wenn Sie Bedenken hinsichtlich der Privatsphäre haben, Ihren Akku nicht entladen möchten oder aus anderen Gründen. Glücklicherweise gibt es mehrere Möglichkeiten, Find My auf dem iPhone zu deaktivieren, die wir alle in diesem Artikel erklären. So deaktivieren Sie Find My auf dem iPhone [4 Methoden] Sie können Find My auf dem iPhone auf vier Arten deaktivieren. Wenn Sie Methode 1 zum Deaktivieren der Suchfunktion verwendet haben, können Sie dies von dem Gerät aus tun, auf dem Sie die Funktion deaktivieren möchten. Um mit den Methoden 2, 3 und 4 fortzufahren, sollte das iPhone, auf dem Sie Find Finder deaktivieren möchten, ausgeschaltet sein oder

Verwenden Sie die Funktion Array.IndexOf in C#, um den Index eines Elements in einem Array zu ermitteln. Wenn wir in einem C#-Programm den Index eines Elements in einem Array ermitteln müssen, können wir die Funktion Array.IndexOf verwenden. Die Funktion Array.IndexOf findet das angegebene Element innerhalb des angegebenen Array-Bereichs und gibt den Index seines ersten Vorkommens zurück. Wenn das Element nicht gefunden wird, wird -1 zurückgegeben. Im Folgenden finden Sie einen Beispielcode, der zeigt, wie Sie mit der Funktion Array.IndexOf ein Element in einem Array finden.

Seriennummern und MAC-Adressen von Festplatten sind wichtige Kennungen in der Computerhardware und sehr nützlich bei der Verwaltung und Wartung von Computersystemen. In diesem Artikel erfahren Sie, wie Sie die Seriennummer und die MAC-Adresse der Festplatte ermitteln. 1. Finden Sie die Seriennummer der Festplatte. Die Seriennummer der Festplatte ist eine eindeutige Kennung, die vom Festplattenhersteller zur Identifizierung und Nachverfolgung der Festplatte verwendet wird. In verschiedenen Betriebssystemen unterscheidet sich die Methode zum Ermitteln der Seriennummer der Festplatte geringfügig. Windows: Öffnen Sie die Eingabeaufforderung (suchen Sie im Startmenü nach „cmd“), geben Sie den folgenden Befehl ein und drücken Sie die Eingabetaste: wmicdisk

Die Funktion glob() in PHP wird zum Suchen von Dateien oder Verzeichnissen verwendet und ist eine leistungsstarke Dateioperationsfunktion. Es kann den Pfad einer Datei oder eines Verzeichnisses basierend auf einer angegebenen Musterübereinstimmung zurückgeben. Die Syntax der glob()-Funktion lautet wie folgt: glob(pattern, flags) wobei „pattern“ die abzugleichende Musterzeichenfolge darstellt, die ein Platzhalterausdruck sein kann, z. B. *.txt (übereinstimmende Dateien mit der Endung .txt) oder einen bestimmten Dateipfad. Flags ist ein optionaler Parameter, der zur Steuerung der Funktion verwendet wird

Hyperbelfunktionen werden mithilfe von Hyperbeln anstelle von Kreisen definiert und entsprechen gewöhnlichen trigonometrischen Funktionen. Es gibt den Verhältnisparameter in der hyperbolischen Sinusfunktion aus dem angegebenen Winkel im Bogenmaß zurück. Aber machen Sie das Gegenteil, oder anders gesagt. Wenn wir einen Winkel aus einem hyperbolischen Sinus berechnen wollen, benötigen wir eine umgekehrte hyperbolische trigonometrische Operation wie die hyperbolische Umkehrsinusoperation. In diesem Kurs wird gezeigt, wie Sie die hyperbolische Umkehrsinusfunktion (asinh) in C++ verwenden, um Winkel mithilfe des hyperbolischen Sinuswerts im Bogenmaß zu berechnen. Die hyperbolische Arkussinusoperation folgt der folgenden Formel -$$\mathrm{sinh^{-1}x\:=\:In(x\:+\:\sqrt{x^2\:+\:1})}, Wo\:In\:ist\:natürlicher Logarithmus\:(log_e\:k)

Eine Karte ist ein spezieller Containertyp in C++, bei dem jedes Element ein Paar aus zwei Werten ist, nämlich einem Schlüsselwert und einem zugeordneten Wert. Der Schlüsselwert wird zum Indizieren jedes Elements verwendet, und der zugeordnete Wert ist der mit dem Schlüssel verknüpfte Wert. Unabhängig davon, ob der zugeordnete Wert eindeutig ist, ist der Schlüssel immer eindeutig. Um Kartenelemente in C++ zu drucken, müssen wir einen Iterator verwenden. Ein Element in einer Menge von Elementen wird durch ein Iteratorobjekt angegeben. Iteratoren werden hauptsächlich mit Arrays und anderen Arten von Containern (z. B. Vektoren) verwendet und verfügen über einen bestimmten Satz von Operationen, mit denen bestimmte Elemente innerhalb eines bestimmten Bereichs identifiziert werden können. Iteratoren können inkrementiert oder dekrementiert werden, um auf verschiedene Elemente in einem Bereich oder Container zu verweisen. Der Iterator zeigt auf den Speicherort eines bestimmten Elements im Bereich. Drucken einer Karte in C++ mit Iteratoren Schauen wir uns zunächst an, wie man definiert

Die Umbenennungsfunktion ändert den alten Namen einer Datei oder eines Verzeichnisses in den neuen Namen. Dieser Vorgang ähnelt dem Verschiebevorgang. Wir können diese Umbenennungsfunktion also auch zum Verschieben von Dateien verwenden. Diese Funktion ist in der Headerdatei der stdio.h-Bibliothek vorhanden. Die Syntax der Umbenennungsfunktion lautet wie folgt: intrename(constchar*oldname,constchar*newname); Die Funktion der rename()-Funktion akzeptiert zwei Parameter. Einer ist alter Name und der andere ist neuer Name. Beide Parameter sind Zeiger auf konstante Zeichen, die den alten und neuen Namen der Datei definieren. Gibt Null zurück, wenn die Datei erfolgreich umbenannt wurde; andernfalls wird eine Ganzzahl ungleich Null zurückgegeben. Während eines Umbenennungsvorgangs
