データ構造とアルゴリズム: 文字列の分割とバランス

データ構造とアルゴリズム: 文字列の分割とバランス

[[441873]]

バランスの取れた文字列を分割する

LeetCode の問題へのリンク: https://leetcode-cn.com/problems/split-a-string-in-balanced-strings

バランスの取れた文字列では、「L」文字と「R」文字の数は同じです。

バランスの取れた文字列 s が与えられた場合、それをできるだけ多くのバランスの取れた文字列に分割するように求められます。

注意: 分割によって取得される各文字列はバランスの取れた文字列である必要があります。

分割によって取得できるバランスの取れた文字列の最大数を返します。

例1:

  • 入力: s = "RLRRLLRLRL"
  • 出力: 4
  • 説明: は「RL」、「RRLL」、「RL」、「RL」に分割でき、各部分文字列には同じ数の「L」と「R」が含まれます。

例2:

  • 入力: s = "RLLLLRRRLR"
  • 出力: 3
  • 説明: は「RL」、「LLLRRR」、「LR」に分割でき、各部分文字列には同じ数の「L」と「R」が含まれます。

例3:

  • 入力: s = "LLLLRRRR"
  • 出力: 1
  • 説明: s は「LLLLRRRR」としてのみ残ります。

例4:

  • 入力: s = "RLRRRLLRLL"
  • 出力: 2
  • 説明: は「RL」、「RRRLLRLL」に分割でき、各部分文字列には同じ数の「L」と「R」が含まれます。

アイデア

この質問は複雑に思えるかもしれませんが、実は非常に単純な貪欲問題です。貪欲に関しては、貪欲アルゴリズムの詳細な説明をここに載せています。これは知っておくべきです!

前から後ろへトラバースし、バランスの取れた部分文字列に遭遇する限り、カウントは +1 となり、1 回トラバースできます。

局所最適: 前から後ろへ走査し、バランスの取れた部分文字列に遭遇するたびにカウントする

グローバル最適性: 最もバランスの取れた部分文字列がカウントされます。

局所最適性は、全体最適性につながる可能性があります。反例を挙げられない場合は、貪欲性を試してください。

たとえば、LRLR 自体はバランスの取れた部分文字列ですが、LR に遭遇すると分割される可能性があります。

C++ コードは次のとおりです。

  1. クラスソリューション{
  2. 公共
  3. int balancedStringSplit(文字列 s) {
  4. int結果 = 0;
  5. 整数 カウント= 0;
  6. ( int i = 0; i < s.size ( ) ); i++) {
  7. s[i] == 'R'の場合カウント++;
  8. それ以外 カウント--;  
  9. count == 0 の場合、結果 ++;
  10. }
  11. 結果を返します
  12. }
  13. };

拡大する

生徒の中には、あなたの推論は信頼できず、数学的な証明がないと考える人もいるかもしれません。どうすればそれが合理的だと言えるのでしょうか? 局所最適が全体最適につながることをどのように示すことができるのでしょうか?

数学的な証明には、一般的に 2 つの方法があります。

  • 数学的帰納法
  • 反証による証明

厳密な数学的証明を本当に提供したい場合、それは実際のところ練習問題や面接の範囲を超えています。

したがって、貪欲問題の思考プロセスは次のようになります。局所最適解が大域最適解につながる可能性がある場合は、反例を挙げてみます。反例を挙げることができない場合は、貪欲解を試します。

その他の言語

ジャワ

  1. クラスソリューション{
  2. 公共  int balancedStringSplit(文字列 s) {
  3. int結果 = 0;
  4. 整数 カウント= 0;
  5. ( int i = 0; i < s.length(); i++) {
  6. s.charAt(i) == 'R'の場合カウント++;
  7. それ以外 カウント--;  
  8. count == 0 の場合、結果 ++;
  9. }
  10. 結果を返します
  11. }
  12. }

JavaScript

  1. var balancedStringSplit =関数(s) {
  2. let res = 0, total = 0; //res はバランスの取れた文字列の数、total は現在の"R"文字と"L"文字の差です
  3. for (let c of s){// 文字列の各文字を走査する
  4. //先頭の文字数の差は 0 なので、トラバースするときに最初に文字数の差を変更する必要があります。そうしないと、結果の数に影響します。
  5. total += c === 'R' ? 1:-1; // "R"に遭遇するとtotal++; "L"に遭遇するとtotal --  
  6. if(total === 0) res++; // 「R」と「L」の数が同じであれば、バランスの取れた文字列とみなすことができます
  7. }
  8. resを返します
  9. };

<<:  2022年の自動運転のトップ10トレンドが発表されました。データインテリジェンスシステムは、自動運転の商用化のクローズドループの鍵となるでしょうか?

>>:  知っておくべき6つのAIバイアス

ブログ    

推薦する

...

...

ベースライン モデルから始めます。最初はモデルが醜く見えるかもしれませんが、心配しないでください。

[[229439]]ビッグデータ概要編纂者:張南星、静哲、荊浩南1. 機械学習製品を効率的に開発す...

メタは自社の弁護士の警告を無視し、海賊版書籍を使用してAIモデルを訓練したと報じられている。

ロイター通信は12月13日、著作権侵害訴訟の新たな文書によると、メタ・プラットフォームズは何千冊もの...

生成 AI は私たちに必要な技術革命でしょうか?

アンディ・ノーラン過去、生成 AI について多くの人が話し、使用し、さまざまなユースケースを試してき...

...

これはナレッジグラフ技術の応用に関するわかりやすいガイドです

[51CTO.com からのオリジナル記事] オブジェクト指向の時代では、すべてがオブジェクトである...

DeepMind: 人工知能と神経科学を組み合わせて好循環を実現

最近の人工知能の進歩は目覚ましいものがあります。人工システムは、アタリのビデオゲーム、古代のボードゲ...

ゼロから始める: すぐに使えるニューラルネットワークを作成することもできます

何か新しいことを受け入れたり、始めたりするのは決して簡単なことではありません。機械学習は、新しいプロ...

C# アルゴリズム アプリケーションでのガウス消去法の実装

C# アルゴリズム アプリケーションでガウス消去法を実装するにはどうすればよいでしょうか?工学の学習...

Java ソートアルゴリズムの概要 (VIII): 基数ソート

基数ソートは「分散ソート」に属します。基数ソートは「バケット ソート」またはビン ソートとも呼ばれま...

...

Sinovationは、あらゆるもののインテリジェントな接続を促進するエッジインテリジェンスプラットフォームTurboXを立ち上げました。

[51CTO.comより引用] 2019年を振り返ると、今年は人工知能、モノのインターネット、クラ...

インタープリタパターンを使用して、要素のXPathパスを取得するためのアルゴリズムを実装します。

[[432233]]文章1. 通訳モード言語に対して、その文法表現(言語のルールを定義するために使...

人工知能が「より賢くなる」ためには、計算能力をアップグレードする必要がある

人工知能に関する最新の報告書「2020-2021年中国人工知能コンピューティング力発展評価報告書」が...