これは、喜びと喜びの最初の本である341、最初の更新365ピアンオリジナル
01の質問と準備ができて見えます
LeetCodeアルゴリズムは、文字(全体タイトル番号3)を繰り返すことなく、第2の質問最長サブストリングの中レベルのタイトルに現在導入されています。最長なし繰り返し文字部分文字列の長さを見つけるために文字列を考えます。例えば:
入力:「abcabcbb」
出力:3
説明:答えは「ABC」、3の長さです。
入力:「BBBBB」
出力:1つの
説明:答えは「B」、1の長さです。
入力:「pwwkew」
出力:3
説明:答えは「WKE」、3の長さです。答えは部分文字列でなければならないことに注意してください、「pwkeは」ではなく、サブストリングのサブシーケンスです。
02第一溶液
激しい使用溶液、二ポインタとHashSet
。
トラバーサル保存された以降の文字から選択した文字たびにHashSet
行くが、意味はHashSet
、彼らは文字を繰り返している場合は、インデックスの計算開始のサイクル長の終わりに、繰り返しかどうかを判断するために、そしてHashSet
空に、サイクルが続きます、その後、すべての文字が処理されるまで、二番目の文字から横断を開始。
このソリューションの時間の複雑さがありO(N^2)
、最悪の場合の時間計算O(N^3)
方法はHashSetのが含まれているため、スペースの複雑さがありますO(N)
。
public int lengthOfLongestSubstring(String s) {
Set<Character> set = new HashSet<Character>();
int n = s.length(), left = 0, right = 0;
int result = 0;
for (int i=0; i<n; i++) {
left = i;
right = i;
while (right < n && !set.contains(s.charAt(right))) {
set.add(s.charAt(right));
right++;
}
result = Math.max(result, right-left);
set.clear();
}
return result;
}
03第二の溶液
最初のソリューションのために、私たちもすることができHashSet
、配列で置き換えるかを決定するために配列を使用し、定期的な文字かどうか、任意の他のアイデアのように。
public int lengthOfLongestSubstring2(String s) {
int[] set = new int[256];
int n = s.length(), left = 0, right = 0;
int result = 0;
for (int i=0; i<n; i++) {
left = i;
right = i;
while (right < n && ++set[s.charAt(right)] < 2) {
right++;
}
result = Math.max(result, right-left);
// 将数组元素值全部重置为0
Arrays.fill(set, 0);
}
return result;
}
04第三の溶液
ウィンドウアルゴリズムをスライディング。
この溶液を上記溶液が、スライドのように、窓のような、2つの変数のいずれかの側を使用して、最初に幾分類似しているすべての文字を横切るまで、重複した値が、左側の文字でHashSetのから削除され遭遇します。
このソリューションの時間の複雑さがありO(N)
、最悪の場合の時間の複雑さO(N^2)
から、方法、スペースの複雑さがあります。HashSet
contains
O(N)
public int lengthOfLongestSubstring3(String s) {
Set<Character> set = new HashSet<Character>();
int n = s.length(), left = 0, right = 0;
int result = 0;
while (left < n && right < n) {
if (!set.contains(s.charAt(right))) {
set.add(s.charAt(right));
right++;
result = Math.max(result, right-left);
} else {
set.remove(s.charAt(left));
left++;
}
}
return result;
}
05第溶液
指標値を同時に決定するために使用されるHashSet
アレイ256の大きさに。
public int lengthOfLongestSubstring4(String s) {
int[] set = new int[256];
int n = s.length(), i = 0, j = 0;
int result = 0;
while (i < n && j < n) {
i = Math.max(set[s.charAt(j)], i);
result = Math.max(result, j-i+1);
set[s.charAt(j)] = j+1;
j++;
}
return result;
}
06まとめ
テーマ別アルゴリズムが連続してい半年以上日間、特集記事のアルゴリズム210件の +記事、公衆番号]ダイアログボックスの返信[ データ構造とアルゴリズム ]、[ アルゴリズム ]、[ データ構造 ]のいずれかの記事のコレクションのシリーズを取得するキーワード。
それはあなたが何か良い解決策のアイデア、提案やその他の問題がある場合、あなたは格好良い、メッセージ転送およびサポートが私の最大の報酬は、以下のコメントを交換することができ、すべてです!