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

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

[[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バイアス

ブログ    
ブログ    

推薦する

...

企業が人工知能を活用してサービスをパーソナライズする方法

パーソナライズされたサービスが大きなメリットをもたらすことは間違いありません。うまく行けば、投資収益...

...

2021年4月のロボット工学分野の重要な動向の概要

ポスト疫病時代において、国内ロボット市場は急速に発展しました。一方、ロボット工学の分野は好調な勢いを...

顔認識に関する国家基準が策定中:顔のスキャンは許可されず、検証後にデータは削除される必要がある

近年、顔認識技術が急速に発展し、顔をスキャンするだけで高速鉄道駅に入ることができるので非常に便利です...

量子コンピューティングは今後10年間で物流業界を変えるだろう

近年、サプライチェーンおよび物流業界は、労働力不足から予測不可能な天候、需給の変化まで、ますます多く...

...

地下鉄路線図のための高速経路探索アルゴリズム

1. 概要過去2日間、Blog Parkで地下鉄マップの実装について話していました。その前に、私もク...

AIのジレンマをどう解決するか?

今日の大手企業が AI におけるいくつかの大きな課題をどのように克服しているか。概要:多くの企業はビ...

国内AI企業500社のビッグデータ分析:業界レイアウトと資金調達・投資動向

[[204973]]序文:今月、テンセント研究所とIT Juziは共同で「2017年中米人工知能ベン...

MWC19 上海 | データセンター 400G ソリューション、AI が未来を拓く

近年、モバイルインターネット、OTTビデオ、VRなどのビジネスアプリケーションの急速な成長に伴い、通...

2019年にAI分野で何が起こったのでしょうか?

2019年は確かに忙しい年でした。人工知能に関する進歩やニュースが頻繁に報道されるにつれ、私たちの...

さまざまなオフィスAIを集めて活用すれば、最も効率的な人材になれる

人工知能(AI)技術の急速な発展は、さまざまな分野に多くの革新と利便性をもたらしました。この記事では...

Java ソートアルゴリズムの概要 (V): マージソート

マージソートとは、2つ(またはそれ以上)の順序付きリストを新しい順序付きリストにマージすることです。...