python最长连续子串_LeetCode 03无重复字符的最长子串(滑动窗口)
關(guān)注、在看,回復(fù)進(jìn)群打卡
題目描述
題目描述:
給定一個(gè)字符串,請(qǐng)你找出其中不含有重復(fù)字符的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "b",所以其長度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "wke",所以其長度為 3。
請(qǐng)注意,你的答案必須是 子串 的長度,"pwke" 是一個(gè)子序列,不是子串。
分析
此題就是給一個(gè)字符串讓你找出最長沒有重復(fù)的一個(gè)字串。?要搞清子串和子序列的區(qū)別:
子串:是連續(xù)的,可以看成原串的一部分截取。
子序列:不一定是連續(xù)的,但是要保證各個(gè)元素之間相對(duì)位置不變。
處理思路?
暴力查找,暴力查找當(dāng)然是可以的,但是復(fù)雜度過高這里就不進(jìn)行講解了。
本題選擇的思路是滑動(dòng)窗口,滑動(dòng)窗口,就是用一個(gè)區(qū)間從左往右,右側(cè)先進(jìn)行試探,找到區(qū)間無重復(fù)最大值,當(dāng)有重復(fù)時(shí)左側(cè)再往右側(cè)移動(dòng)一直到?jīng)]重復(fù),然后重復(fù)進(jìn)行。在整個(gè)過程中找到最大的那個(gè)空間返回即可。
但是在Java編程語言中如何操作呢?
定義一個(gè)left和right,表示滑動(dòng)的區(qū)間。初始均為0.定義一個(gè)max表示最長初始為0.
right往右移動(dòng),同時(shí)記錄易懂經(jīng)過元素的個(gè)數(shù)。當(dāng)遇到重復(fù)即存在該元素的時(shí)候暫停。比較這個(gè)長度(right-left+1)與max的大小,max是否需要更新。
接著left往右移動(dòng),同時(shí)移動(dòng)途中將出現(xiàn)字母的詞數(shù)減一。直到移動(dòng)到right位置相同字母的右側(cè)說明當(dāng)前窗口沒有重復(fù)序列了,繼續(xù)循環(huán)執(zhí)行到結(jié)束。
在這里插入圖片描述
當(dāng)然,最長的情況也在其中,因?yàn)槲覀冎灰恢貜?fù)right就會(huì)右移,不能移的時(shí)候前一個(gè)即可能是最大長度:
你可能會(huì)問,用什么存儲(chǔ)這個(gè)詞數(shù)呢?
哈希當(dāng)然可以啦,你可以用HashMap存儲(chǔ)記錄這個(gè)值進(jìn)行維護(hù),就是可能偶爾稍微麻煩一點(diǎn)。
因?yàn)樵蹅冎雷址鹀har它底層是一個(gè)ASCII,是一個(gè)數(shù)值,我們可以創(chuàng)建一個(gè)int數(shù)組直接把ASCII值作為數(shù)組對(duì)應(yīng)下表進(jìn)行處理,這樣雖然占了點(diǎn)內(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;i?????????{
?????????????a[s.charAt(i)]++;
?????????????while?(a[s.charAt(i)]>1)?{
????????????????a[s.charAt(l++)]--;
????????????}
?????????????if(i-l+1>max)
?????????????????max=i-l+1;
?????????}
?????????return?max;
????}
}
最后,歡迎點(diǎn)贊、收藏給個(gè)支持吧,如果有啥錯(cuò)誤或者看法可以評(píng)論區(qū)留言哦!
最近往期精彩回顧:
json從立地到成佛
Thymeleaf一篇就夠了
兩分鐘真能搞懂桶排序
SpringMVC文件上傳下載
學(xué)弟不懂原碼反碼補(bǔ)碼,氣的我給女朋友講了一夜
LeetCode 01兩數(shù)之和&02兩數(shù)相加
歡迎關(guān)注微信公眾號(hào):bigsai?,回復(fù)打卡即可進(jìn)群一起打卡力扣哦!
總結(jié)
以上是生活随笔為你收集整理的python最长连续子串_LeetCode 03无重复字符的最长子串(滑动窗口)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏里的角色都什么格式图片_为什么这游戏
- 下一篇: python etree创建xml_利用