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

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

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

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

ブログ    

推薦する

「クローズドループ」に向けての運転 | LMDrive: LLM に基づく初のクローズドループ エンドツーエンド自動運転

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

OpenAIの人事異動で最大の勝者はオープンソースコミュニティになると予想される

米国現地時間11月20日朝、マイクロソフトは突然、OpenAIの元CEOアルトマン氏とOpenAI社...

...

Midjourney 5.2 がリリースされました!オリジナルの絵画から3Dシーンを生成し、無限の宇宙を無限に拡大します

旅の途中と安定した拡散が限界に達しました! Stable Diffusion XL 0.9 がリリー...

...

...

中国の大学の人工知能専攻ランキング:清華大学、浙江大学、上海交通大学がトップ3にランクイン

AIの開発が国家戦略にまで上り詰めるにつれ、人工知能は大学入試の選択肢の中でも最も注目され、最も人気...

2021年に自動運転はどのように発展するのでしょうか?

EEtimesより翻訳2021年に自動運転車はどうなるでしょうか。自動運転業界の昨年の業績は平凡で...

2020年に中国で期待されるAI企業トップ10

近年の新興技術として、人工知能は人々の生活のあらゆる側面に静かに浸透し、比較的ホットな産業に発展しま...

顔認識技術は議論を呼んでいる。人工知能はどのように制御されるべきか?

[[264511]]最近、米国の18歳の大学生が、アップルが顔認識ソフトウェアを使用して彼を強盗と...

...

調査会社がAI主要9分野を数え、世界各国のAI法規制を分析

世界中の政府は、AI技術革命に直面しても既存の法律、規制、枠組みが引き続き有効であることを保証し、新...

...