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;
????}