給定乙個字串,請你找出其中不含有重複字元的最長子串的長度.
示例 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...