描述:
給定一個字符串,請你找出其中不含有重復(fù)字符的最長子串的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因為無重復(fù)字符的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因為無重復(fù)字符的最長子串是 "b",所以其長度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因為無重復(fù)字符的最長子串是 "wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
思路:
使用一個變量left記錄無重復(fù)字符子串的左邊界。則長度可以表示為:i - left +1
其中 i 是當前遍歷到的位置。
用HashMap<字符,位置> 儲存每個字符的位置,用temp記錄當前字符串長度。
如果出現(xiàn)重復(fù)字符時,上一次出現(xiàn)+1 的位置開始計算。
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: 訪問完第二個b之后,left=2,如果沒有這句下一步left又變成1了。
left= Math.max(left,map.get(ch)+1);
}
map.put(ch,i);
max= Math.max(max,i-left+1);
}
return max;
}
}