スポンサーリンク

【LeetCode】3.Longest Substring Without Repeating Characters 解答・解説【Python】

スポンサーリンク
スポンサーリンク
この記事は約3分で読めます。

 

問題

原文

Given a string s, find the length of the longest substring without repeating characters.

 

Example 1:

Example 2:

Example 3:

 

Constraints:

  • 0 <= s.length <= 5 * 104
  • s consists of English letters, digits, symbols and spaces.

 

内容

文字列sが与えられます。最大部分文字列を見つけてください。

 

例3: s = “pwwkew”

“wke”が最大部分文字列であり、その長さは3です。

“pwke”は各要素の場所を変えてしまっているのでだめなようです。

 

※正しくない可能性があります。

方針

前提

・2つのポインタを使う

・それぞれのポインタは文字列sにおける部分文字列の左端と右端を指すインデックス

※左右のインデックスの差が部分文字列の長さを表す

実装のイメージ

・文字列s内の各文字を全探索する

・各文字が初出現の要素である限り右のポインタを右に伸ばし続ける

・既出要素がある場合で、その既出要素が左右のポインタの外側にある場合は右のインデックスを右に伸ばし続ける

・既出要素がある場合で、その既出要素が左右のポインタの内側にある場合は、左ポインタを右ポインタの右隣りに変更する

 

イメージ ※赤が左、青が右ポインタ

まずは左右のポインタを広げていく

a b c b b c a c

a b c b b c a c

a b c b b c a c ※bは既出(2文字目)なので、左ポインタを移動。

a b c b b c a c ※左ポインタを最初のbの右隣りにして再スタート

同時に、2つ目のb(青色のb)の位置を記録

a b c b b c a c ※bは既出(4文字目)なので、左ポインタを移動。

a b c b b c a c ※左ポインタは2つ目のbの位置の右隣になり、再スタート

a b c b ba c

a b c b b c a c

↑このように最後まで繰り返して左右のポインタの幅が最大だった時の値を返す。

 

解答

解答1:Python, two pointer

 

・時間計算量O(n)

nは文字列sの文字数。leftポインタを更新しながら進むので、1巡するだけで良い。

・空間計算量O(m)

mは重複を除外した文字列s内の文字数。

各文字の出現位置を記録するハッシュテーブル(辞書)を記録する必要があるので、m文字分の記憶領域が必要

 

解答2:Rust

写経

 

補足・参考・感想

参考

自分が後で見返して理解しやすいように、ツールを使って図解しつつ、記事に組み込めるようにしたい。

 

前:704. Binary Search

次:12. Integer to Roman

LeetCode 解答・解説記事一覧

コメント