JAVA窗口sin值_大厂经典笔试题—LeetCode03无重复字符的最长子串(滑动窗口)
題目描述
原創(chuàng)作者:bigsai,長期維護不易,如有收獲還請點贊、收藏支持!
題目描述:
給定一個字符串,請你找出其中不含有重復(fù)字符的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"輸出: 3解釋: 因為無重復(fù)字符的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入: "bbbbb"輸出: 1解釋: 因為無重復(fù)字符的最長子串是 "b",所以其長度為 1。
示例 3:
輸入: "pwwkew"輸出: 3解釋: 因為無重復(fù)字符的最長子串是 "wke",所以其長度為 3。請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
分析
此題就是給一個字符串讓你找出最長沒有重復(fù)的一個字串。 要搞清子串和子序列的區(qū)別:
- 子串:是連續(xù)的,可以看成原串的一部分截取。
- 子序列:不一定是連續(xù)的,但是要保證各個元素之間相對位置不變。
處理思路?
- 暴力查找,暴力查找當(dāng)然是可以的,但是復(fù)雜度過高這里就不進行講解了。
本題選擇的思路是滑動窗口,滑動窗口,就是用一個區(qū)間從左往右,右側(cè)先進行試探,找到區(qū)間無重復(fù)最大值,當(dāng)有重復(fù)時左側(cè)再往右側(cè)移動一直到?jīng)]重復(fù),然后重復(fù)進行。在整個過程中找到最大的那個空間返回即可。
但是在Java編程語言中如何操作呢?
- 定義一個left和right,表示滑動的區(qū)間。初始均為0.定義一個max表示最長初始為0.
- right往右移動,同時記錄移動經(jīng)過元素的個數(shù)。當(dāng)遇到重復(fù)即存在該元素的時候暫停。比較這個長度(right-left+1)與max的大小,max是否需要更新。
- 接著left往右移動,同時移動途中將出現(xiàn)字母的詞數(shù)減一。直到移動到right位置相同字母的右側(cè)說明當(dāng)前窗口沒有重復(fù)序列了,繼續(xù)循環(huán)執(zhí)行到結(jié)束。
當(dāng)然,最長的情況也在其中,因為我們只要不重復(fù)right就會右移,不能移的時候前一個即可能是最大長度:
你可能會問,用什么存儲這個詞數(shù)呢?
- 哈希當(dāng)然可以啦,你可以用HashMap存儲記錄這個值進行維護,就是可能偶爾稍微麻煩一點。
因為咱們知道字符char它底層是一個ASCII,是一個數(shù)值,我們可以創(chuàng)建一個int數(shù)組直接把ASCII值作為數(shù)組對應(yīng)下表進行處理,這樣雖然占了點內(nèi)存但是使用起來方便很多。
ac代碼
附上ac 代碼:
class?Solution?{????public?int?lengthOfLongestSubstring(String?s)?{?????????????int?a[]=new?int[500];?????????int?max=0;?????????int?l=0;?????????for(int?i=0;i1)?{????????????????a[s.charAt(l++)]--;????????????}?????????????if(i-l+1>max)?????????????????max=i-l+1;?????????}?????????return?max;????}}最后,歡迎關(guān)注、點贊、收藏給個支持吧!持續(xù)分享哦
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的JAVA窗口sin值_大厂经典笔试题—LeetCode03无重复字符的最长子串(滑动窗口)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++编程例子_如何开始厉害的C语言编程
- 下一篇: 稀疏矩阵三元组 严蔚敏_Sparse稀疏