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

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

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

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

ブログ    
ブログ    
ブログ    

推薦する

単純なアルゴリズム問題からO(1)が何を意味するかを説明する

[[396914]]今日、クラスメートがファングループでアルゴリズムに関する質問をしました。対話のト...

企業はビッグデータ アルゴリズムを使用して効果的なリンクを構築できますか?

ビッグデータは人々にとって巨大な概念であるようです。しかし、多くの企業がすでに業務にビッグデータを活...

あなたのビジネスに必要な AI 処理ユニットはどれですか?

データセンターに AI を導入することを検討している場合は、まず投資すべきハードウェアとインフラスト...

ハルビン工科大学と快手が共同でCogGPTを提案:大規模モデルにも認知反復が必要

認知科学の分野では、人間が継続的な学習を通じて認知を変化させるプロセスを認知ダイナミクスと呼びます。...

OpenAIは低コストで開発者を引き付けるために大規模なアップデートを計画している

10月12日、外国メディアは関係者の話として、人工知能(AI)研究企業OpenAIが来月、開発者向け...

...

...

Googleがこれまでで最も強力なAIモデル「Gemini」を発表

グーグルは水曜日、AIを収益化する方法に対する回答を求める圧力が高まる中、同社がこれまでで最も強力だ...

AI リサーチ インスティテュートが 2021 年の AI 技術トレンド トップ 10 を発表

[[374480]] 12月31日、AI研究所は2020年のAIの進歩トップ10を発表しました。新年...

多様性がAI戦略の成功の鍵となる理由

機械学習と人工知能に関しては、スキャンダルが後を絶ちません。過去数ヶ月、マイクロソフトのジャーナリス...

ビッグデータの本当の問題と、なぜ機械学習だけがそれを解決できるのか

多くの企業が、データの取得から洞察の獲得まで、スムーズに実行されるパイプラインの構築に依然として苦労...