這是剛剛學到的算法——滑動窗口法Sliding Window, 題目以下java
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。 示例 1: 輸入: "abcabcbb" 輸出: 3 解釋: 由於無重複字符的最長子串是 "abc",因此其長度爲 3。 示例 2: 輸入: "bbbbb" 輸出: 1 解釋: 由於無重複字符的最長子串是 "b",因此其長度爲 1。 示例 3: 輸入: "pwwkew" 輸出: 3 解釋: 由於無重複字符的最長子串是 "wke",因此其長度爲 3。 請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。···
先說滑動窗口法是怎麼工做的,滑動窗口法藉助哈希表實現,我把它理解爲有兩個窗口——左窗口和右窗口,對着這道題來講,左窗口和右窗口會包住一個區間,這個區間裏的全部字母都是沒有重複的,舉個栗子,對於字符串abcadc來講
一開始左窗口右窗口都在0的位置,而且咱們有一個hashMap,hashMap記錄字母最後一次出現的位置。
出事情況爲下面,當前最大非重複子串長度爲 0
【】abcadc
而後右窗口向右移動,當前最大非重複子串長度爲 右窗口-左窗口+1 =1,hashMap = {「a」:0}
【a】bcadc
此時窗口裏的字符串沒有重複字符,右窗口繼續移動,當前最大非重複子串長度爲 右窗口-左窗口+1 =2,hashMap = {「a」:0,「b」:「1」}
【ab】cadc
此時窗口裏的字符串沒有重複字符,右窗口繼續移動,當前最大非重複子串長度爲3,hashMap = {「a」:0,「b」:「1」,「c」:2}
【abc】adc
此時窗口裏的字符串沒有重複字符,右窗口向右移動,此時出現了重複字符a,咱們藉助hashMap知道,上一次a出現的地方是0,因此咱們把左窗口推動到0+1的位置,最大非重複子串長度爲右窗口-左窗口+1 = 3,a。hashMap = {「a」:3,「b」:「1」,「c」:2}
a【bca】dc
此時窗口裏的字符串沒有重複字符,右窗口向右移動,最大非重複子串長度爲右窗口-左窗口+1 = 4,hashMap = {「a」:3,「b」:「1」,「c」:2,「d」:4}
a【bcad】c
此時窗口裏的字符串沒有重複字符,右窗口向右移動,咱們發現c已經出現過了,而且出現過的位置是2,左窗口移到2+1處,hashMap = {「a」:3,「b」:「1」,「c」:5,「d」:4},最大非重複子串長度爲右窗口-左窗口+1 = 3。
abc【adc】
接下來三步省略。
這個過程當中出現的最大的非重複子串長度爲4,因此咱們的答案是4.
有了思路後很容易獲得咱們的代碼web
import java.util.ArrayList; import java.util.HashMap; public class Solution { public int lengthOfLongestSubstring(String s) { int ans = 0; HashMap<Character, Integer> map = new HashMap<>(); int leftWindow=0,rightWindow = 0; for (; rightWindow < s.length(); rightWindow++) { if (map.containsKey(s.charAt(rightWindow))){ leftWindow = Math.max(leftWindow, map.get(s.charAt(rightWindow))+1); } map.put(s.charAt(rightWindow), rightWindow); ans = Math.max(ans, rightWindow-leftWindow+1); } return ans; } }