ホームページ バックエンド開発 PHPチュートリアル 文字列のプレフィックススコアの合計

文字列のプレフィックススコアの合計

Sep 26, 2024 am 06:13 AM

Sum of Prefix Scores of Strings

2416. Summe der Präfixwerte der Zeichenfolgen

Schwierigkeit:Schwer

Themen:Array, String, Trie, Counting

Sie erhalten ein Array von Wörtern der Größe n, bestehend aus nicht leeren Zeichenfolgen.

Wir definieren die Punktzahl eines Zeichenfolgenworts als die Anzahl der Zeichenfolgenwörter[i], sodass das Wort ein Präfix der Wörter[i] ist.

  • Wenn beispielsweise Wörter = ["a", "ab", "abc", "cab"] sind, beträgt die Punktzahl von "ab" 2, da "ab" ein Präfix von "ab" und "ab" ist „abc“.

Gib eine Array-Antwort der Größe n zurück, wobei Antwort[i] die Summe der Bewertungen aller nicht leeren Präfixe von Wörtern[i] ist.

Beachten Sie, dass eine Zeichenfolge als Präfix von sich selbst betrachtet wird.

Beispiel 1:

  • Eingabe: Wörter = ["abc", "ab", "bc", "b"]
  • Ausgabe: [5,4,3,2]
  • Erklärung: Die Antwort für jede Zeichenfolge lautet wie folgt:
    • „abc“ hat drei Präfixe: „a“, „ab“ und „abc“.
    • Es gibt 2 Zeichenfolgen mit dem Präfix „a“, 2 Zeichenfolgen mit dem Präfix „ab“ und 1 Zeichenfolge mit dem Präfix „abc“.
    • Die Summe ist Antwort[0] = 2 + 2 + 1 = 5.
    • „ab“ hat zwei Präfixe: „a“ und „ab“.
    • Es gibt 2 Zeichenfolgen mit dem Präfix „a“ und 2 Zeichenfolgen mit dem Präfix „ab“.
    • Die Summe ist Antwort[1] = 2 + 2 = 4.
    • „bc“ hat zwei Präfixe: „b“ und „bc“.
    • Es gibt 2 Zeichenfolgen mit dem Präfix „b“ und 1 Zeichenfolge mit dem Präfix „bc“.
    • Die Summe ist Antwort[2] = 2 + 1 = 3.
    • „b“ hat 1 Präfix: „b“.
    • Es gibt 2 Zeichenfolgen mit dem Präfix „b“.
    • Die Summe ist Antwort[3] = 2.

Beispiel 2:

  • Eingabe:words = ["abcd"]
  • Ausgabe: [4]
  • Erklärung:
    • „abcd“ hat 4 Präfixe: „a“, „ab“, „abc“ und „abcd“.
    • Jedes Präfix hat eine Punktzahl von eins, daher ist die Gesamtsumme Antwort[0] = 1 + 1 + 1 + 1 = 4.

Einschränkungen:

  • 1 <= Wörter.Länge <= 1000
  • 1 <= Wörter[i].Länge <= 1000
  • Wörter[i] bestehen aus englischen Kleinbuchstaben.

Hinweis:

  1. Mit welcher Datenstruktur können Sie die Punktzahl jedes Präfixes effizient verfolgen?
  2. Verwenden Sie einen Versuch. Fügen Sie alle Wörter ein und bewahren Sie an jedem Knoten einen Zähler auf, der Ihnen anzeigt, wie oft wir jedes Präfix besucht haben.

Lösung:

Wir können eine Trie-Datenstruktur verwenden, die besonders effizient für die Arbeit mit Präfixen ist. Jeder Knoten im Trie stellt einen Buchstaben des Wortes dar, und wir verwalten an jedem Knoten einen Zähler, um zu speichern, wie oft dieses Präfix angetroffen wurde. Dadurch können wir die Punktzahl jedes Präfixes effizient berechnen, indem wir zählen, wie viele Wörter mit diesem Präfix beginnen.

Ansatz:

  1. Wörter in Trie einfügen:

    • Wir fügen jedes Wort Zeichen für Zeichen in das Trie ein.
    • An jedem Knoten (der ein Zeichen darstellt) verwalten wir einen Zähler, der verfolgt, wie viele Wörter dieses Präfix durchlaufen.
  2. Präfix-Scores berechnen:

    • Für jedes Wort summieren wir beim Durchlaufen seiner Präfixe im Trie die an jedem Knoten gespeicherten Zähler, um die Punktzahl für jedes Präfix zu berechnen.
  3. Antwortarray erstellen:

    • Für jedes Wort berechnen wir die Summe der Bewertungen für alle seine Präfixe und speichern sie im Ergebnisarray.

Lassen Sie uns diese Lösung in PHP implementieren: 2416. Summe der Präfixwerte der Zeichenfolgen

<?php
class TrieNode {
    /**
     * @var array
     */
    public $children;
    /**
     * @var int
     */
    public $count;

    public function __construct() {
        $this->children = [];
        $this->count = 0;
    }
}

class Trie {
    /**
     * @var TrieNode
     */
    private $root;

    public function __construct() {
        $this->root = new TrieNode();
    }

    /**
     * Insert a word into the Trie and update the prefix counts
     *
     * @param $word
     * @return void
     */
    public function insert($word) {
       ...
       ...
       ...
       /**
        * go to ./solution.php
        */
    }

    /**
     * Get the sum of prefix scores for a given word
     *
     * @param $word
     * @return int
     */
    public function getPrefixScores($word) {
       ...
       ...
       ...
       /**
        * go to ./solution.php
        */
    }
}

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

// Example usage:
$words1 = ["abc", "ab", "bc", "b"];
$words2 = ["abcd"];

print_r(sumOfPrefixScores($words1)); // Output: [5, 4, 3, 2]
print_r(sumOfPrefixScores($words2)); // Output: [4]
?>




<h3>
  
  
  Erläuterung:
</h3>

<ol>
<li>
<p><strong>TrieNode-Klasse:</strong></p>

<ul>
<li>Jeder Knoten verfügt über ein Array von untergeordneten Knoten (die die nächsten Zeichen im Wort darstellen) und eine Zählung, um zu verfolgen, wie viele Wörter dieses Präfix teilen.</li>
</ul>
</li>
<li>
<p><strong>Trie-Klasse:</strong></p>

<ul>
<li>Die Einfügemethode fügt dem Trie ein Wort hinzu. Wenn wir jedes Zeichen einfügen, erhöhen wir die Anzahl an jedem Knoten und geben an, wie viele Wörter dieses Präfix haben.</li>
<li>Die getPrefixScores-Methode berechnet die Summe der Bewertungen für alle Präfixe eines bestimmten Wortes. Es durchläuft den Trie und addiert die Anzahl jedes Knotens, der einem Zeichen im Wort entspricht.</li>
</ul>
</li>
<li>
<p><strong>Hauptfunktion (sumOfPrefixScores):</strong></p>

<ul>
<li>First, we insert all words into the Trie.</li>
<li>Then, for each word, we calculate the sum of scores for its prefixes by querying the Trie and store the result in the result array.</li>
</ul>
</li>
</ol>

<h3>
  
  
  Example:
</h3>

<p>For words = ["abc", "ab", "bc", "b"], the output will be:<br>
</p>

<pre class="brush:php;toolbar:false">Array
(
    [0] => 5
    [1] => 4
    [2] => 3
    [3] => 2
)
ログイン後にコピー
  • "abc" has 3 prefixes: "a" (2 words), "ab" (2 words), "abc" (1 word) -> total = 5.
  • "ab" has 2 prefixes: "a" (2 words), "ab" (2 words) -> total = 4.
  • "bc" has 2 prefixes: "b" (2 words), "bc" (1 word) -> total = 3.
  • "b" has 1 prefix: "b" (2 words) -> total = 2.

Time Complexity:

  • Trie Construction: O(n * m) where n is the number of words and m is the average length of the words.
  • Prefix Score Calculation: O(n * m) as we traverse each word's prefix in the Trie.

This approach ensures that we efficiently compute the prefix scores in linear time relative to the total number of characters in all words.

Contact Links

If you found this series helpful, please consider giving the repository a star on GitHub or sharing the post on your favorite social networks ?. Your support would mean a lot to me!

If you want more helpful content like this, feel free to follow me:

  • LinkedIn
  • GitHub

以上が文字列のプレフィックススコアの合計の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? Apr 17, 2025 am 12:06 AM

PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか? スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか? Apr 17, 2025 am 12:25 AM

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

PHPの永続的な関連性:それはまだ生きていますか? PHPの永続的な関連性:それはまだ生きていますか? Apr 14, 2025 am 12:12 AM

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHP対その他の言語:比較 PHP対その他の言語:比較 Apr 13, 2025 am 12:19 AM

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPおよびPython:コードの例と比較 PHPおよびPython:コードの例と比較 Apr 15, 2025 am 12:07 AM

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

See all articles