leetcode 3 無重複字元的最長子串

2021-08-28 08:11:28 字數 1735 閱讀 8449

#include#include#include#includeusing namespace std;
方法一:暴力法

思路

逐個檢查所有的子字串,看它是否不含有重複的字元。

演算法

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

現在讓我們填補缺少的部分:

為了列舉給定字串的所有子字串,我們需要列舉它們開始和結束的索引。假設開始和結束的索引分別為 ii 和 jj。那麼我們有 0 \leq i \lt j \leq n0≤i要檢查乙個字串是否有重複字元,我們可以使用集合。我們遍歷字串中的所有字元,並將它們逐個放入set中。在放置乙個字元之前,我們檢查該集合是否已經包含它。如果包含,我們會返回false。迴圈結束後,我們返回true

//左閉右開區間

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

else

}return true;

}int lengthoflongestsubstring(string s)

} }return max_length;

}

方法二:

演算法

暴力法非常簡單。但它太慢了。那麼我們該如何優化它呢?

在暴力法中,我們會反覆檢查乙個子字串是否含有有重複的字元,但這是沒有必要的。如果從索引 ii 到 j - 1j−1之間的子字串 s_sij​ 已經被檢查為沒有重複字元。我們只需要檢查 s[j]s[j] 對應的字元是否已經存在於子字串 s_sij​中。

要檢查乙個字元是否已經在子字串中,我們可以檢查整個子字串,這將產生乙個複雜度為 o(n^2)o(n2) 的演算法,但我們可以做得更好。

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

滑動視窗是陣列/字串問題中常用的抽象概念。 視窗通常是在陣列/字串中由開始和結束索引定義的一系列元素的集合,即 [i, j)[i,j)(左閉,右開)。而滑動視窗是可以將兩個邊界向某一方向「滑動」的視窗。例如,我們將 [i, j)[i,j)向右滑動 11 個元素,則它將變為 [i+1, j+1)[i+1,j+1)(左閉,右開)。

回到我們的問題,我們使用 hashset 將字元儲存在當前視窗 [i, j)[i,j)(最初 j = ij=i)中。 然後我們向右側滑動索引 jj,如果它不在 hashset 中,我們會繼續滑動 jj。直到 s[j] 已經存在於 hashset 中。此時,我們找到的沒有重複字元的最長子字串將會以索引 ii 開頭。如果我們對所有的 ii 這樣做,就可以得到答案。

int lengthoflongestsubstring(string s)

else

}return max_len;

}

主函式呼叫:

int main()

leetcode 3 無重複的字串

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

leetcode 3 無重複字元的最長字元子串

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

leetcode 3 最長無重複字串

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