問題は、私は、歩行の「最長増加部分列」を行う前に、考えに基づいているとき、私はこれをやって始めました。
オープンに長さの反復配列の始まりはそうあなたが頭の最長の部分文字列を見つけることができることを、[いいえ]各文字列の配列に格納され、その後の文字のプレスタイトルleetcode.1のアイデアたいですハッシュテーブルを行うと、オーバーに体重をチェックするために文字列を追加します。
クラスのソリューション{ 公共の int型のチェック(のString、int型I){ のHashMap <文字、整数> strLength = 新しい HashMapの<> (); int型 J = 0 ; 用(; I <s.length(); I ++ ){ 場合(strLength.containsKey(s.charAt(I))){ ブレーク。 } 他{ strLength.put(s.charAt(I)、I)。 } J ++ ; } 戻りJ。 } 公共 のintlengthOfLongestSubstring(文字列S){ int型 LEN [] = 新しい INT [s.length()]。 int型の最大値= 0 ; int型のインデックス= 0 ; 以下のために(INT ; I <s.length(); iが0 = I ++ ){ lenの[I] = チェック(S、i)は、 もし(MAX < lenの[I]){ インデックス = I。 最大 = lenの[i]は、 } } int型の長さ= チェック(S、指数)。 戻り値の長さ。 } }
アイデアはシンプルですが、.... のRAN 83ms
だから私は学習、問題にはほとんど解決策を見つける「スライディングウィンドウアルゴリズムを。」
実際には、つまり、いくつかの変更を加えた重量にチェックするためにハッシュテーブルを追加します。そのインデックスは、繰り返される絞り込むことが判明した場合、たとえば[i、j)とし、その後はまで、私を増やすことで、入力されたキーは、jの境界を広げるために繰り返されることはありません追加、寄託された要素の集合と最後の冒頭で定義されていますこれまで繰り返しません。常に間隔の間に最大[最大]距離レコードで更新。スキャンが完了するか、全体の配列が得られた後ので、文字列の最大のストリングの最大長です。
クラスソリューション{ 公共 のint lengthOfLongestSubstring(文字列S){ int型 N = s.length()。 int型私= 0、J = 0 ; int型 ANS = 0 ; HashMapの <文字、整数> STR = 新しい HashMapの<> (); 一方、(I <N && J < N){ 場合(!str.containsKey(s.charAt(J))){ str.put(s.charAt(J)、J - I)。 J ++ ; ANS = Math.max(ANS、J- I)。 } 他{ str.remove(s.charAt(I))。 I ++ ; } } 戻りANSを、 } }
これは嘆きを強制するために、13msのを走りました。
実際には、このアルゴリズムは、だけでなく、スペースを最適化していき、https://www.codercto.com/a/63236.html見つけることができます