用到的思想是【滑動窗口】
- 維護一個隊列,使得隊列符合題目要求。例如字符串“pwwkew”,那麼隊列“pw”、“wke”可以,“pww”、“wkew”就不行。
- 將不滿足要求的隊列中重複的字符移除隊列即可。
- 假設一個原始、題目給定的字符串S1,我們通過兩個指針left、i 維護一個隊列S2, 設指針left指向S2左端,i指向S2的右端,當加入的字符與S2中的字符重複了,就更新left,使得【窗口】或【隊列】往右滑,去掉重複的字符。
- 每次更新隊列的長度,更新最大值max,這樣最後的max就是答案。
class Solution {
public int lengthOfLongestSubstring(String s) {
int left = 0;
int max = 0;
Map<Character,Integer> map = new HashMap<>();
for(int i = 0; i < s.length(); i++){
if(map.containsKey(s.charAt(i))){
left = Math.max(left, map.get(s.charAt(i)) + 1);
}
max = Math.max(max, i - left + 1);
map.put(s.charAt(i), i );
}
return max;
}
}
對一行代碼的解釋:
left = Math.max(left, map.get(s.charAt(i)) + 1);
直接left = map.get(s.charAt(i)) + 1,是不行的。直觀地解釋就是,可能會使得窗口錯誤的往左滑。 因爲 abba 這種情況當遍歷到索引i爲3時,由於b重複左指針left已經到了2,不能更新爲a的第一次位置+1(即0+1=1)
map中存放的是無須、不重複的鍵值對《字符,索引》。