題目描述
給定一個字符串 s ,請你找出其中不含有重複字符的最長子串的長度。
示例
輸入: s = "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
題目分析
要求從字符串中找到最長的不含重複字符的子串,那麼就存在一個區間[start,end],在這個區間內,每個字符不重複且長度最長。怎麼找到這個區間呢?首先設置兩個指針start和end,start指向區間開始,end指向區間結束,初始都指向s開始,同時我們需要知道字符是否出現過,此時申請一個set,記錄start-end出現的字符,向右移動end指針,若沒有出現,則加入該字符入set,繼續向右移動,若已經出現,此時需要移動start指針的位置到之前該字符出現位置的下一個位置,繼續移動end,這個方法有個官方的名字--滑動窗口。下面圖解一下,更直觀。
解法1
public int lengthOfLongestSubstring(String s) { //如果長度<=1直接返回 if (s.length() <= 1) { return s.length(); } //開始指針和結束指針均指向第一個位置 int start = 0, end = 0; Set<Character> set = new HashSet<>(); int max = 1; set.add(s.charAt(start)); ++ end; while (start <= end && end < s.length()) { if (set.contains(s.charAt(end))) { //如果區間內出現過 int ans = end - start; max = Math.max(max, ans); //將之前字符前的全部移除出去 while(start < end && s.charAt(start) != s.charAt(end)) { set.remove(s.charAt(start)); ++ start; } ++ start; ++ end; } else { set.add(s.charAt(end)); ++ end; } } int ans = end - start; max = Math.max(max, ans); return max; }
注:公衆號每天早上更新哦~歡迎大家關注