毎日のアルゴリズム: 文字の繰り返しのない最長の部分文字列

毎日のアルゴリズム: 文字の繰り返しのない最長の部分文字列

[[421075]]

この記事はWeChatの公開アカウント「3分でフロントエンドを学ぶ」から転載したもので、著者はsisterAnです。この記事を転載する場合は、「3分で学ぶフロントエンド」公式アカウントまでご連絡ください。

文字列が与えられた場合、重複する文字を含まない最長の部分文字列の長さを計算します。

例1:

  1. 入力: "abcabcbb"  
  2. 出力: 3
  3. 説明: 重複文字のない最長の部分文字列は「abc」なので、その長さは 3 です。

例2:

  1. 入力: "bbbbb"  
  2. 出力: 1
  3. 説明: 重複文字のない最長の部分文字列は「b」なので、その長さは 1 です。

例3:

  1. 入力: "pwwkew"  
  2. 出力: 3
  3. 説明: 重複文字のない最長の部分文字列は「wke」なので、その長さは 3 です。
  4. 答えは部分文字列の長さでなければならないことに注意してください。 「pwke」は部分文字列ではなく、部分シーケンスです。

解決策1: アレイのメンテナンス

解決策: 配列を使用してスライディングウィンドウを維持する

文字列を走査し、文字がスライディングウィンドウ配列内にあるかどうかを判定する

  • そうでない場合は、配列にプッシュします
  • 次に、スライディングウィンドウ配列内の同じ文字とその前の文字を削除し、現在の文字を配列にプッシュします。
  • 次に、現在の最長部分文字列の長さにmaxを更新します。

トラバース後、最大値を返す

理解を助けるために絵を描きます:

コード実装:

  1. var lengthOfLongestSubstring =関数(s) {
  2. arr = []、 max = 0とします
  3. ( i = 0 とします; i < s.length; i++) {
  4. インデックス= arr.indexOf(s[i])とします。
  5. if(インデックス!== -1) {
  6. arr.splice(0,インデックス+1);
  7. }
  8. arr.push(s.charAt(i))
  9. max = Math. max (arr. length, max )
  10. }
  11. 戻る 最大 
  12. };

時間計算量: O(n2)。arr.indexOf() の時間計算量は O(n)、arr.splice(0, index+1) の時間計算量は O(n) です。

空間計算量: O(n)

解決策2: 下付き文字を維持する

解決策: スライディングウィンドウを維持するために下付き文字を使用する

コード実装:

  1. var lengthOfLongestSubstring =関数(s) {
  2. インデックス= 0、最大値= 0とします
  3. (i = 0, j = 0; j < s.length; j++)の場合{
  4. インデックス= s.substring (i, j).indexOf(s[j] )
  5. if(インデックス!== -1) {
  6. i = i +インデックス+ 1
  7. }
  8. 最大値= Math.max (最大値, j-i+1 )
  9. }
  10. 戻る 最大 
  11. };

時間計算量: O(n2)

空間計算量: O(n)

解決策3: 最適化されたマップ

解決:

マップを使用して、これまでに走査された文字を保存します。キーは文字で、値は添え字です。

i を使用して、繰り返しのない部分文字列の開始添え字をマークし、j は現在のトラバーサル文字の添え字です。

文字列をトラバースし、現在の文字がマップ内に既に存在するかどうかを判断します。存在する場合は、インデックス i で始まる非繰り返し部分文字列を、同じ文字の次の位置に更新します。この時点で、i から j までが最新の非繰り返し部分文字列であり、max を更新し、現在の文字とインデックスをマップに格納します。

最後に最大値を返す

コード実装:

  1. var lengthOfLongestSubstring =関数(s) {
  2. map = new Map()、 max = 0とします。
  3. (i = 0, j = 0; j < s.length; j++)の場合{
  4. (map.has(s[j]))の場合{
  5. i = Math.max (map.get(s[j]) + 1, i) です。
  6. }
  7. 最大値= Math.max (最大値, j-i+1 )
  8. マップをセットする(s[j], j)
  9. }
  10. 戻る 最大 
  11. };

時間計算量: O(n)

空間計算量: O(n)

<<:  コンテンツ管理と AI – ContentOps の未来

>>:  ロボットが人間の「仲間」となり、人間と機械の関係が変化する。これは良いことなのか、悪いことなのか?

ブログ    

推薦する

AIによって次に職を奪われるのは字幕作成者でしょうか?

2016年頃から、多くのメディアが「どの仕事がAIに置き換えられるか」を予測し始めたとぼんやりと記...

AIが中国の山水画を生成!プリンストン大学の女子学生が卒業制作で描いた線と筆致は、人間の観察者の半数を騙した。

GAN を使用して作品を制作することは新しいことではないようです。 2019年、NVIDIAはGT...

ディープラーニングでは複素数を使うべきでしょうか?

マンデルブロ複素集合: https://en.wikipedia.org/wiki/Mandelbr...

資本から絶大な支持を受ける人工知能が、なぜ金融分野で壁にぶつかっているのか。

マーフィー著昨年のAlphaGo、今年のLibratusと、さまざまな業界で「人工知能」のトレンドが...

「ロボット交通警察」が登場!最先端技術が輸送業界に力を与える

現在、科学技術の継続的な進歩により、ロボットは徐々にさまざまな産業の変革のための重要なツールとなり、...

単一の画像ガイド、主題を保持し、スタイルを変更する、VCTはそれを簡単に実現するのに役立ちます

近年、画像生成技術は多くの重要な進歩を遂げました。特に、DALLE2やStable Diffusio...

自動化プロジェクトの成功は、ビジネスとITの高度な連携にかかっています。

[[399107]]ウー・ウェイ UiPath Greater China 社長前回 UiPath...

人工知能が教室に導入されると、教育プロセスにどのような変化が起こるでしょうか?

人工知能技術の応用により、コースの内容、教授法、教師と生徒の関係が変化しています。人工知能の利用によ...

人間の農業の将来は主にロボットに依存することになるのでしょうか?基本的に人間の介入は必要ありません

予想外のことが起こらなければ、人類は人工知能の時代へと急速に進んでいくだろう。ウェイター、宅配便業者...

駐車問題を解決する 3 つの最善の方法をご存知ですか?

近年、都市部の駐車場の問題はますます顕著になっており、混乱した駐車が頻繁に発生し、人々の移動や生活に...

...

脳コンピューターインターフェースから量子コンピューティングまで: 今後 10 年間のトップ 10 のテクノロジートレンド

21 世紀の最初の 10 年が過ぎましたが、この 10 年間で私たちは多くの新しいテクノロジーによっ...

...

マイクロソフトの無料 AI エッセイ採点ソフトウェアがアップグレード: IELTS、CET-4、CET-6 に使用可能

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...