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

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

[[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 の未来

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

ブログ    
ブログ    

推薦する

...

WeiboにおけるSparkベースの大規模機械学習の応用

[[195122]]周知のとおり、Weibo のビジネスは 2015 年以降急速に成長しています。内...

...

PyTorch でテンソルを操作するための 5 つの基本関数

ニューラル ネットワークを正確かつ効率的に構築する能力は、ディープラーニング エンジニアの採用担当者...

DeepMap COO 羅偉氏との独占インタビュー:自動運転の時代に、スタートアップは高精度地図の分野でどのように躍進できるのか?

最近、シリコンバレーの高精度地図サービスプロバイダーであるDeepMapは、Accelが主導し、エン...

人工知能は今日私たちに何をもたらすのでしょうか?知らないブラックテクノロジーをチェック

人工知能といえば、映画「アイアンマン」に登場する賢い執事ジャービスを思い浮かべる人もいるかもしれませ...

...

このベクターニューラルスタイルのブラシを使用すると、GANなしで美しい絵画を生成できます

CVPR 2021で発表された論文の中で、NetEase Fuxiとミシガン大学の研究者は、制御可能...

クラウドに人工知能を導入する際の 10 の考慮事項

クラウド コンピューティングは、あらゆる規模の企業がインターネット経由で多様なオンデマンドの仮想 I...

医療における会話型 AI の 5 つの用途

パンデミックの影響で、医療業界は世界中で医師、看護師、その他の医療スタッフの深刻な不足に直面していま...

...

ITとビジネスの調和を実現する: デジタル変革にローコードが不可欠な理由

[51CTO.com クイック翻訳]ビジネスの世界では、デジタルトランスフォーメーションという言葉を...

...

人工知能は私たちに何をもたらしてくれるのでしょうか?人工知能は非常に強力です

人工知能は皆さんにとって馴染み深いものかもしれませんが、では人工知能は一体何ができるのでしょうか?本...

...