leetcode演算法3 最長無重複子串長度

2021-08-19 11:37:52 字數 2586 閱讀 4215

給定乙個字串,找到最長子串的長度,而不重複字元。

給定「abcabcbb」,答案是「abc」,長度為3。

給定「bbbbb」,答案是「b」,長度為1。

給定「pwwkew」,答案是「wke」,長度為3.請注意,答案必須是子字串,「pwke」是子串行而不是子字串。

利用滑動視窗思想,滑動視窗內的字元將不會重複,滑動視窗利用兩個索引i,j分別指向視窗的前後界限,通過分別移動i,j指標來尋求最大子串長度。

檢查所有子字串逐個檢視是否沒有重複的字元。

假設我們有乙個函式boolean allunique(string substring),如果子字串中的字元都是唯一的,否則返回true,否則為false。我們可以遍歷給定字串s的所有可能的子字串,並呼叫allunique函式。如果事實證明是正確的,那麼我們更新我們的子字串的最大長度的答案,而不會有重複的字元。

現在我們填寫缺失的部分:

要列舉給定字串的所有子字串,我們列舉它們的開始和結束索引。假設開始和結束指數分別為i和j。那麼我們有0 <= i < j <=n(這裡的結束索引j按照慣例排除)。因此,使用從0到n-1的i的兩個巢狀迴圈和從i + 1到n的j,我們可以列舉s的所有子串。

要檢查乙個字串是否有重複的字元,我們可以使用乙個字串。我們遍歷字串中的所有字元,並將它們逐個放入。在放置乙個字元之前,我們檢查該集合是否已經包含它。如果是這樣,我們返回false。迴圈後,我們返回true。

123

4567

891011

1213

1415

1617

1819

20

public

class

solution

public

boolean allunique(string s,int start,int end)

return

true;

}}

時間複雜度:o(n ^ 3)

空間複雜度:o(min(n,m))o(min(n,m))。我們需要o(k)空格用於檢查子串沒有重複字元,其中k是set的大小。集合的大小由字串n的大小和字符集/字母表m的大小限定。

上面演算法一方法非常簡單。但是太慢了那麼我們如何才能優化呢?

在上面的方法中,我們反覆檢查乙個子字串,看看它是否具有重複的字元。但這是沒有必要的。如果乙個子字串s[i,j)是從索引i到j-1已經被檢查為沒有重複的字元。我們只需要檢查s[j]是否已經在子串s[i,j)中。要檢查字元是否已經在子字串中,我們可以掃瞄子字串,導致o(n ^ 2)演算法。但我們可以做得更好。

通過使用hashset作為滑動視窗,檢查當前的字元是否可以在o(1)中完成。

滑動視窗是陣列/字串問題中常用的抽象概念。視窗是陣列/字串中通常由開始和結束索引定義的元素範圍,即[i,j)(左閉合,右開)。滑動視窗是乙個視窗,將其兩個邊界滑動到某個方向。例如,如果我們通過乙個元素將[i,j)向右滑動,則它變為[i + 1,j + 1)(左閉右開)。

回到我們的問題。我們使用hashset將字元儲存在當前視窗[i,j)(j = i)。然後我們將索引j向右滑動。如果不在hashset中,我們會進一步滑動j。這樣做直到s[j]已經在hashset中。在這一點上,我們發現沒有重複字元的子字串的最大大小從索引i開始。重複上面的步驟,我們就能得到我們的答案。

時間複雜度: o(2n) = o(n)。最糟糕的情況是每個字元都需要被i,j指標訪問兩次。

空間複雜度: o(min(m,n))。 和上面的方案一樣,我們同樣需要乙個o(k)的空間用於滑動視窗,k表示滑動視窗大小。這個大小取決於字串n的大小以及字符集的大小m

上述方法2中解決方案最多需要2n步。 事實上,它可以被優化,只需要n個步驟。 我們可以定義乙個字元與其索引的對映,而不是使用乙個字元來判斷乙個字元是否存在。 然後,當我們發現重複的字元時,我們可以立即跳過這些字元。

原因是如果s[j]在索引j的範圍[i,j)中具有重複,重複的這個索引為j』,我們不需要一點一點地增加i。 我們可以跳過[i,j』]範圍內的所有元素,直接令i=j』+ 1。

123

4567

891011

1213

1415

public

class

solution

ans = math.max(ans, j - i + 1);

map.put(s.charat(j), j + 1);

}return ans;

}}

假設字符集為ascii 128

以前的實現都沒有對字串的字符集的假設。

如果我們知道字符集相當小,我們可以將整數陣列替換為直接訪問表。

常用的**有:

123

4567

891011

1213

public

class

solution

return ans;

}}

時間複雜度:o(n)

hashmap空間複雜度:o(min(m,n))

table方式空間複雜度:o(m) m表示字符集的大小

leetcode演算法練習 無重複字元的最長字串

給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。示例 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。輸入 pwwkew 輸出 3 解釋 因為無重複字元的最長子...

leetcode 3 最長無重複字串

3.longest substring without repeating characters 題面 given a string,find the length of the longest substring without repeating characters.給定字串,找到最長無重複字...

Leetcode記錄 3題 無重複字元的最長子串

思路 用乙個128長度的boolean陣列存放所有ascii碼中的符號,初始化都為false表示沒有訪問過,雙指標i,j初始指向0,遍歷給定字串所有字元。如果j所指字元未訪問,則將該字元改為已訪問,並向右移 否則j訪問的字元表示已訪問,len取當前長度和j i的最大值,並且將i移動到和j所指字元重複...