描述:
給定一個(gè)字符串瘪菌,請(qǐng)你找出其中不含有重復(fù)字符的最長(zhǎng)子串的長(zhǎng)度摄凡。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 "abc"袱蚓,所以其長(zhǎng)度為 3技潘。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 "b"技扼,所以其長(zhǎng)度為 1粮呢。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因?yàn)闊o(wú)重復(fù)字符的最長(zhǎng)子串是 "wke"婿失,所以其長(zhǎng)度為 3。
請(qǐng)注意啄寡,你的答案必須是 子串 的長(zhǎng)度豪硅,"pwke" 是一個(gè)子序列,不是子串挺物。
思路:
使用一個(gè)變量left記錄無(wú)重復(fù)字符子串的左邊界懒浮。則長(zhǎng)度可以表示為:i - left +1
其中 i 是當(dāng)前遍歷到的位置。
用HashMap<字符,位置> 儲(chǔ)存每個(gè)字符的位置砚著,用temp記錄當(dāng)前字符串長(zhǎng)度次伶。
如果出現(xiàn)重復(fù)字符時(shí),上一次出現(xiàn)+1 的位置開始計(jì)算稽穆。
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0 || s==null)
return 0 ;
Map<Character,Integer> map = new HashMap<Character,Integer>();
int left = 0;
int max = 0;
for(int i=0;i<s.length();i++){
Character ch = s.charAt(i);
if(map.containsKey(ch)){
//這句代碼防止左邊界再倒退回去
//比如abba: 訪問(wèn)完第二個(gè)b之后冠王,left=2,如果沒(méi)有這句下一步left又變成1了舌镶。
left= Math.max(left,map.get(ch)+1);
}
map.put(ch,i);
max= Math.max(max,i-left+1);
}
return max;
}
}