. Verschiedene Möglichkeiten, Klammern hinzuzufügen

Barbara Streisand
Freigeben: 2024-09-20 06:56:07
Original
359 Leute haben es durchsucht

. Different Ways to Add Parentheses

241. Verschiedene Möglichkeiten, Klammern hinzuzufügen

Schwierigkeit:Mittel

Themen: Mathematik, String, dynamische Programmierung, Rekursion, Memoisierung

Geben Sie bei einem gegebenen Zeichenfolgenausdruck aus Zahlen und Operatoren alle möglichen Ergebnisse aus der Berechnung aller verschiedenen Möglichkeiten zum Gruppieren von Zahlen und Operatoren zurück. Sie können die Antwort in beliebiger Reihenfolge zurücksenden.

Die Testfälle werden so generiert, dass die Ausgabewerte in eine 32-Bit-Ganzzahl passen und die Anzahl der unterschiedlichen Ergebnisse 10 nicht überschreitet4.

Beispiel 1:

  • Eingabe: Ausdruck = "2-1-1"
  • Ausgabe: [0,2]
  • Erklärung:
  ((2-1)-1) = 0
  (2-(1-1)) = 2
Nach dem Login kopieren

Beispiel 2:

  • Eingabe: Ausdruck = "2*3-4*5"
  • Ausgabe: [-34,-14,-10,-10,10]
  • Erklärung:
  (2*(3-(4*5))) = -34
  ((2*3)-(4*5)) = -14
  ((2*(3-4))*5) = -10
  (2*((3-4)*5)) = -10
  (((2*3)-4)*5) = 10
Nach dem Login kopieren

Einschränkungen:

  • 1 <= expression.length <= 20
  • Der Ausdruck besteht aus Ziffern und den Operatoren „+“, „-“ und „*“.
  • Alle ganzzahligen Werte im Eingabeausdruck liegen im Bereich [0, 99].
  • Die ganzzahligen Werte im Eingabeausdruck haben kein führendes „-“ oder „+“, das das Vorzeichen angibt.

Lösung:

Wir können Rekursion in Kombination mit Memoisierung verwenden, um zuvor berechnete Ergebnisse für Unterausdrücke zu speichern, da dies redundante Berechnungen vermeidet und die Lösung optimiert.

Ansatz:

  1. Rekursion:

    • Für jeden Operator in der Zeichenfolge (+, -, *) teilen wir den Ausdruck an diesem Operator auf.
    • Rekursiv den linken und rechten Teil des Ausdrucks berechnen.
    • Kombinieren Sie die Ergebnisse beider Teile mit dem Operator.
  2. Auswendiglernen:

    • Speichern Sie die Ergebnisse von Unterausdrücken in einem assoziativen Array, um zu vermeiden, dass derselbe Unterausdruck mehrmals neu berechnet wird.
  3. Basisfall:

    • Wenn der Ausdruck nur eine Zahl enthält (d. h. keine Operatoren), geben Sie diese Zahl als Ergebnis zurück.

Beispielhafte Vorgehensweise:

Für die Eingabe „2*3-4*5“:

  • Teilen bei * -> 2 und 3-4*5
    • Rekursiv 3-4*5 und 2 berechnen und dann kombinieren.
  • Aufteilung bei - -> 2*3 und 4*5
    • Rekursiv berechnen und kombinieren.
  • Ähnliches gilt für andere Teilungen.

Lassen Sie uns diese Lösung in PHP implementieren: 241. Verschiedene Möglichkeiten, Klammern hinzuzufügen

<?php
class Solution {

    /**
     * @var array
     */
    private $memo = [];

    /**
     * @param String $expression
     * @return Integer[]
     */
    public function diffWaysToCompute($expression) {
       ...
       ...
       ...
       /**
        * go to ./solution.php
        */
    }

    /**
     * @param $expression
     * @return array|mixed
     */
    private function compute($expression) {
       ...
       ...
       ...
       /**
        * go to ./solution.php
        */
    }
}

// Example usage
$solution = new Solution();
$expression1 = "2-1-1";
$expression2 = "2*3-4*5";
print_r($solution->diffWaysToCompute($expression1)); // Output: [0, 2]
print_r($solution->diffWaysToCompute($expression2)); // Output: [-34, -14, -10, -10, 10]
?>
Nach dem Login kopieren

Erläuterung:

  1. Memoisierung: Das $memo-Array speichert die berechneten Ergebnisse für jeden Ausdruck, um redundante Berechnungen zu vermeiden.
  2. Basisfall: Wenn der Ausdruck numerisch ist, wird er in eine Ganzzahl umgewandelt und zu den Ergebnissen hinzugefügt.
  3. Rekursive Aufteilung: Teilen Sie jeden Operator im Ausdruck in einen linken und einen rechten Teil auf, berechnen Sie die Ergebnisse für beide Teile rekursiv und kombinieren Sie sie dann basierend auf dem Operator.
  4. Beispielverwendung: Die diffWaysToCompute-Funktion wird mit Beispielausdrücken getestet, um die Lösung zu überprüfen.

Dieser Ansatz stellt sicher, dass Sie alle möglichen Ergebnisse effizient berechnen, indem Sie die Memoisierung nutzen, um redundante Berechnungen zu vermeiden.

Kontaktlinks

Wenn Sie diese Serie hilfreich fanden, denken Sie bitte darüber nach, dem Repository einen Stern auf GitHub zu geben oder den Beitrag in Ihren bevorzugten sozialen Netzwerken zu teilen? Ihre Unterstützung würde mir sehr viel bedeuten!

Wenn Sie weitere hilfreiche Inhalte wie diesen wünschen, folgen Sie mir gerne:

  • LinkedIn
  • GitHub

Das obige ist der detaillierte Inhalt von. Verschiedene Möglichkeiten, Klammern hinzuzufügen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!