無重複字元的最長子串

2022-06-02 23:06:17 字數 1976 閱讀 3663

給定乙個字串,請你找出其中不含有重複字元的最長子串的長度.

示例 1:

輸入: "

abcabcbb

"輸出:

3解釋: 因為無重複字元的最長子串是

"abc

",所以其長度為 3。

示例2:

輸入: "

bbbbb

"輸出:

1解釋: 因為無重複字元的最長子串是 "b

",所以其長度為 1。

示例3:

輸入: "

pwwkew

"輸出:

3解釋: 因為無重複字元的最長子串是 

"wke

",所以其長度為 3

。  請注意,你的答案必須是 子串 的長度,

"pwke

" 是乙個子串行,不是子串。

解法一:暴力解決

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

演算法:如果我們有乙個函式allunique(_ s: string, start: int, end: int) -> bool,如果子字串的字元都是唯一的,它會返回true,否則會返回false。我們遍歷給定字串s的所有可能的子字串並呼叫函式allunique,如果事實證明返回值為true,那麼我們將會更新無重複子串的最大長度的答案。

為了列舉給定字串的所有子字串,我們需要列舉它們開始和結束的索引。假設開始和結束的索引分別為 i 和 j。

那麼我們有0<=i要檢查乙個字串是否有重複字元,可以使用集合。我們遍歷字串中的所有字元,並將它們逐個放入set中,在放置乙個字元之前,檢查改集合是否已經包含它,如果包含,我們會返回false,迴圈結束後,我們返回true。

let s: string = "

abcabcbb

"func lengthoflongestsubstring(_ s: string) ->int }}

return

results

}func allunique(_ s: string, start: int, end: int) ->bool

set.insert(ch)

}return

true

}let result =lengthoflongestsubstring(s)

print(result)

解法二:滑動視窗法

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

在暴力法中,我們會反覆檢查乙個子字串是否含有有重複的字元,但這是沒有必要的。

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

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

let s: string = "

abcabcbb

"func lengthoflongestsubstring(_ s: string) ->int

else

}return

results

}let result =lengthoflongestsubstring(s)

print(result)

時間複雜度:o(2n)=o(n),在最糟糕的情況下,每個字元將被 i和 j訪問兩次。

空間複雜度:o(min(m,n)),與之前的方法相同。滑動視窗法需要 o(k)的空間,其中 k 表示set的大小。而 set 的大小取決於字串 nn 的大小以及字符集 / 字母 mm 的大小。

以上就是兩種方式,大家要著重理解一下後一種方式!!!

無重複字元最長子串

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

無重複字元最長子串

題目描述 給定乙個字串,找出不含有重複字元的 最長子串 的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是子串行而不是子串 i...

無重複字元的最長子串

給定乙個字串,找出不含有重複字元的最長子串的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是 子串行 而不是子串。int le...