Inhaltsverzeichnis
Brute-Force-Ansatz
Modifizierte längste gemeinsame Teilsequenz (LCS)
Beispiel
Ausgabe
Verbesserte Lösung
Fazit
Heim Backend-Entwicklung C++ C++-Programm, um herauszufinden, ob eine bestimmte Zeichenfolge eine sich wiederholende Teilsequenz mit einer Länge von 2 oder mehr hat

C++-Programm, um herauszufinden, ob eine bestimmte Zeichenfolge eine sich wiederholende Teilsequenz mit einer Länge von 2 oder mehr hat

Sep 17, 2023 pm 02:41 PM
c程序 查找 Teilsequenz wiederholen

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"));
Nach dem Login kopieren

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 3str = "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 von

Brute-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;
}
Nach dem Login kopieren

Ausgabe

Repeated subsequence of length 2 or more: Yes
Nach dem Login kopieren
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

Ausgabe

Repeated subsequence of length 2 or more: Yes
Nach dem Login kopieren
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So deaktivieren Sie „Mein iPhone suchen'. So deaktivieren Sie „Mein iPhone suchen'. Nov 09, 2023 pm 02:21 PM

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

4 Möglichkeiten, Find My auf dem iPhone zu deaktivieren 4 Möglichkeiten, Find My auf dem iPhone zu deaktivieren Feb 02, 2024 pm 04:15 PM

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

Finden Sie den Index eines Elements in einem Array mit der Funktion Array.IndexOf in C# Finden Sie den Index eines Elements in einem Array mit der Funktion Array.IndexOf in C# Nov 18, 2023 am 09:59 AM

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.

So überprüfen Sie die Seriennummer und die MAC-Adresse der Festplatte So überprüfen Sie die Seriennummer und die MAC-Adresse der Festplatte Feb 18, 2024 pm 07:45 PM

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 Die Funktion glob() in PHP wird zum Suchen von Dateien oder Verzeichnissen verwendet Nov 18, 2023 pm 06:17 PM

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

C++-Programm zum Ermitteln des Werts der Umkehrfunktion des hyperbolischen Sinus, wobei ein gegebener Wert als Argument verwendet wird C++-Programm zum Ermitteln des Werts der Umkehrfunktion des hyperbolischen Sinus, wobei ein gegebener Wert als Argument verwendet wird Sep 17, 2023 am 10:49 AM

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)

C++-Programm zum Drucken eines Wörterbuchs C++-Programm zum Drucken eines Wörterbuchs Sep 11, 2023 am 10:33 AM

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

Das C-Programm verwendet die Funktion rename(), um den Dateinamen zu ändern Das C-Programm verwendet die Funktion rename(), um den Dateinamen zu ändern Sep 21, 2023 pm 10:01 PM

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

See all articles