文字列を考えると、文字を繰り返すことなく、最長の部分文字列の長さを見つけます。
出典:ボタン(LeetCode)に滞在
します。https://leetcode-cn.com/problems/longest-substring-without-repeating-charactersリンク
すべてのネットワークからの控除が著作権を保有します。商業転載は許可公式、非商用の転載は、ソースを明記してくださいお問い合わせください。
この質問は、上の私たちの手を取得、誰でも思いつきそう、直接暴力トラバーサルです。結果は可能であるが、効率が低すぎるものの、最終的には、ハローに合格しなかった場合があります。あるいは、多くの精神的、物理的、ああへ
公共 INT lengthOfLongestSubstring(文字列S){ int型の長さ= 0 。 もし(isUnique(S)) { 長さ = s.length()。 } int型のインデックス= s.length()。 以下のために(int型 i = 0; iは<インデックス、iは++ ) { ための(int型 J =指数; J> = I; j-- ) { 文字列str = s.substring(i、j)は、 もし(isUnique(STR)&& str.length()> 長さ) { //遭遇が最長であることを確認最初の予選の一の列の後方から前方に横断し、従ってに沿って横断する必要はありません 長さ= str.length(); BREAK ; } // サブ文字の残りの部分文字列の長さは、もはや前方を横断する必要はない一時的な以下の結果である IF - (私は<= J 長) { BREAK ; } } } 戻り値の長さ; } パブリック ブールisUnique(文字列S) { セット <文字> SET = 新しい新しい HashSetの<文字> (); char型 []文字の= s.toCharArray(); のために(チャーC:文字) { set.add(C); } 戻り(set.size()== s.length())。 }
どんなに最適化する方法、そして最終的に合格しなかった場合はありません。一見、この問題の暴力的な解決策は動作しませんか??
説明のすべての種類は、ウィンドウのソリューションをスライディング記載されている参照してください、そして、私は改善の余地がまだあるものの、最終的に渡され、このアルゴリズムのビットアイデアをチェックするために、そして自分自身の理解に応じてコードを書くために行ってきました...
公共 INT lengthOfLongestSubstring(文字列S){ int型の結果= 0 。 int型 ; 0 =左 // 窗口左边界 int型右= 0; // 窗口右边界 INT長= s.length()。 設定する <文字>設定= 新しい HashSetの<文字> (); 一方(左<長&&右< 長さ) { int型温度= 0 。 もし(!set.contains(s.charAt(右))) { set.add(s.charAt(右)); 右++ ; TEMP = set.size(); IF(TEMP> 結果) { 結果 = TEMP; } } 他 { // すでに文字セットに存在して発見された場合は、右に左境界を置く set.remove(s.charAt (左)); 左 ++ ; } } 戻り、検索結果を }