#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.給定字串,找到最長無重複字...