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

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

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

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

ブログ    
ブログ    

推薦する

...

iOS 18 の新機能がついに公開されました!

今年は生成AI技術が大変人気です。ChatGPTの登場以来、多くの大規模な生成AIモデルが雨後の筍の...

ロボットやAIが事故を起こした場合、誰が責任を負うのでしょうか?

[[348005]]自動運転車が歩行者をはねた場合、法的責任を負うのは誰でしょうか?所有者、製造者...

指紋、顔、虹彩: 適切な生体認証技術を選択するには?

[[351445]]最近、クレジットカード会社からデータ漏洩に関する連絡がありましたか? あるいは...

AIを活用して都市の建物の特性を識別し、地震などの災害に対するリスクを予測する

ビッグデータダイジェスト制作出典: サイエンスデイリー編集者: ジェーン人工知能は、ビジネスから工業...

アマゾン、AIが女性の求職者に低い評価を与えたため研究チームを解散に追い込まれる

[[246043]]アマゾンの機械学習チームは2014年以来、優秀な人材の求職活動をよりスマートにす...

誰が私たちの個人情報をスパイしているのでしょうか?顔認識の悪用

「顔認証」や「顔スキャン決済」は顔認識技術の継続的な発展です。今では、小型カメラの助けを借りて、私た...

視覚と言語の多粒度の調整を学習しますか? Byte は、新しいマルチモーダル事前トレーニング方法 X-VLM を提案しました。コードがオープンソース化されました。

前面に書かれた視覚言語の事前トレーニングにより、多くの視覚言語タスクのパフォーマンスが向上します。し...

自然言語処理にディープラーニングを使用するにはどうすればよいでしょうか?練習チェックリストはこちら

[[198324]]導入この記事は、自然言語処理 (NLP) にニューラル ネットワークを使用する方...

世界モデルに関するいくつかの誤解と自動運転との統合に関する考察

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

Sparkに代わると期待されるリアルタイム機械学習フレームワークRay

新しいプロジェクトは、Python で記述された機械学習アプリケーションをサポートするために使用でき...

AIを規制するための答えは何でしょうか?なぜこれが重要なのでしょうか?

AntWorks の共同創設者兼 CEO である Asheesh Mehra 氏が、AI を規制す...

...

...