劍指 Offer II 016. 不含重復(fù)字符的最長(zhǎng)子字符串(中等)

s給定一個(gè)字符串?s?,請(qǐng)你找出其中不含有重復(fù)字符的最長(zhǎng)連續(xù)子字符串?的長(zhǎng)度。

示例?1: 輸入: s = "abcabcbb"

????????????輸出: 3

????????????解釋:因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子字符串是"abc",所以其長(zhǎng)度為 3。

解題思路:使用滑動(dòng)窗口法,定義兩個(gè)指針,left和right,left表示窗口的左側(cè)下標(biāo),right表示窗口的右側(cè)下標(biāo),窗口大小為right-left+1。

? ? ? ? ? ? ? ? ? ?定義一個(gè)hashMap<Character,?Integer>,key是s內(nèi)的各字符,value是key對(duì)應(yīng)的下標(biāo)。

? ? ? ? ? ? ? ? ? right一直++,?每+一次,就在hashMap查找是否有重復(fù)字符,并把right的字符加入hashMap,直到窗口內(nèi)出現(xiàn)了重復(fù)字符,這時(shí)候令left=該字符對(duì)應(yīng)的原下標(biāo)+1,并在hashMap中刪除left之前的所有字符對(duì)應(yīng)數(shù)據(jù),并把right的字符加入hashMap。 直到right=s.length()-1,遍歷完成。

? ? ? ? ? ? ? ? ? ? 返回窗口的最大大小。

public?int?lengthOfLongestSubstring(String?s)?{

????????Map<Character,?Integer>?hashTable?=?new?HashMap<>();? ?//?定義一個(gè)hashMap?來(lái)存儲(chǔ)是否有重復(fù)的字符

????????int?left?=?0;

????????int?right?=?0;

????????int?max?=?0;

????????while?(right<s.length())?{

????????????if(hashTable.get(s.charAt(right))?!=?null)?{ //?如果hashMap中有重復(fù)字符

????????????????int?temp?=?left;

????????????????left?=?hashTable.get(s.charAt(right))?+?1;// 令left=該字符對(duì)應(yīng)的原下標(biāo)+1

????????????????for(int?i=temp;?i<left-1;?i++)?{

????????????????????hashTable.remove(s.charAt(i)); // 在hashMap中刪除left之前的所有字符對(duì)應(yīng)數(shù)據(jù)

????????????????}

????????????}

????????????hashTable.put(s.charAt(right),?right);// 把right的字符加入hashMap

????????????max?=?Math.max(max,?right-left+1); // 返回窗口的最大大小

????????????right++;

????????}

????????return?max;

????}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容