leetcode 3 無重複字符的最長子串

這是剛剛學到的算法——滑動窗口法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;
    }
}
相關文章
相關標籤/搜索