文字列を考えると、あなたは、繰り返し文字の最長の文字列のサブ長さを含んでいないかを調べます。
例1:
入力:「abcabcbb」 出力:3 説明:繰り返しのない文字の最長のサブが「ABC」であるため、その長さが3です。
例2:
入力:「BBBBB」 出力:1つの 説明:その長さが1になるように最長のストリングは、「B」せずに文字を繰り返しているため。
例3:
入力:「pwwkew」 出力:3 説明:その長さは3であるので、最長のサブ文字列が、「WKE」せずに文字を繰り返しているため。 あなたの答えは、長さの部分文字列でなければならないことに注意してください、「pwkeは」サブシーケンスではなく、部分文字列です。
アイデア:
スライディングウィンドウ:主なアイデアは、この質問を使用することです
スライディングウィンドウとは何ですか?
そのような例のように、キューは、実際には abcabcbb
、するキュー(ウィンドウ)を入力し abc
再入力をする際、対象の要件を満たし a
、キューに abca
、この時間が要件を満たしていません。そこで、我々は、キューを移動したいです!
どのように動くのか?
私達はちょうど質問を満たすまでは、ライン上のキューのうち、左側の要素を入れて!
そのようなキューを維持している、時間の最長の長さを見つけるためにキューが解決策を見つけ、表示されます!
時間の複雑さ:O(N-)O (N- )
コード:
クラスのソリューション: - > int型:lengthOfLongestSubstring(strの自己、S):defは ないにS:戻り0 左= 0 、ルックアップ=セット() のn = LEN(S) MAX_LEN = 0 cur_len = 0 の範囲内のiに対する(N): cur_len + = 1つの 一方、S [i]は、ルックアップで: lookup.remove(S [左]) 左+ = 1 cur_len - = 1 MAX_LEN = MAX(cur_len、MAX_LEN) lookup.add(S [i])と リターンMAX_LEN