この問題では、特定の文字列内に同じ数の小文字と大文字が含まれる文字列の総数をカウントする必要があります。この問題を解決する単純な方法は、すべての部分文字列を検索し、同じ数の小文字と大文字を持つ部分文字列の総数をカウントすることです。
効果的な方法は、部分配列の合計問題を使用することです。小文字を -1 として扱い、大文字を 1 として扱うことができ、問題を解決する両方の方法を学習します。
問題ステートメント- 小文字と大文字のアルファベットを含む文字列 str が与えられています。同じ数の小文字と大文字を含む部分文字列の合計数をカウントする必要があります。
###例### 入力– str = 'TutOR'
出力– 4
説明– 同じ数の小文字と大文字を含む、「Tu」、「TutO」、「tO」、「utOR」の 4 つの部分文字列を取得できます
入力– str = 'abcd'
出力– 0
説明– 文字列には小文字のみが含まれているため、同じ小文字と大文字を含む部分文字列を取得できません。 入力
– str = 'XYz'出力
– 1説明
- 「Yz」部分文字列のみを取得できます。方法1
これは問題を解決するための素朴な方法です。 3 つのネストされたループを使用して、指定された文字列のすべての部分文字列を検索します。各部分文字列に同じ数の小文字と大文字が含まれているかどうかを確認します。そうであれば、カウントを 1 ずつ増やします。の中国語訳は次のとおりです:
Example###アルゴリズム###
整数をキーと値のペアとして含む「合計」マップを定義します。 変数 'cnt' は、小文字と大文字が等しい部分文字列の総数を格納するために定義され、ゼロに初期化されます。同時に、プレフィックスと を保存する変数「current」を定義します。の中国語訳は次のとおりです:
Exampleしたがって、文字列の反復を開始すると、「current」の値は最初のインデックスで 0 になります。そこで、「cnt」の値を1増やします。繰り返しますが、3 番目のインデックスではゼロになります。そこで、「cnt」の値を1〜2増やします。以前に 0 を取得したので、それはマップ内に存在し、その値を「cnt」に追加する必要があります。そうすると、3になります。
時間計算量
- O(N)、文字列を 1 回しか走査しないため。
空間複雑度
– マップを使用してプレフィックスの合計を保存するため、O(N)。最悪の場合、文字列にすべて小文字または大文字が含まれる場合、O(N) 個のスペースが必要になります。私たちは、上記の問題を解決するために 2 つの異なる方法を使用することを学びました。最初の方法は、ネストされたループを使用してすべての文字列をチェックします。一方、2 番目の方法は、時間の計算量の点で最初の方法よりも効率的ですが、より多くのスペースを消費します。
以上が小文字と大文字が同じ数の部分文字列の数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。