1. 程式人生 > 實用技巧 >003無重複字元的最長子串

003無重複字元的最長子串

寫在前面,參考的力扣官網的畫解演算法

滑動視窗

class Solution {
    public int lengthOfLongestSubstring(String s) {

        //定義字串長度,距離
        int n=s.length(),ans=0;

        //用什麼裝start指標
        //定義一個map資料結構儲存(k,v),期中key為字元,value值為字元位置+1
        //+1表示從字元位置後一個才開始不重複
        Map<Character,Integer>map=new HashMap<>();

        //定義不重複字串的開始位置為start,結束位置為end
        for(int end=0,start=0;end<n;end++){
            char alpha=s.charAt(end);

             //什麼時候更新start?start更新為多少?
            //隨著end的不斷向後遍歷,會遇到與[start,end]區間內字元相同的情況
            if(map.containsKey(alpha)){

                //map中取的是什麼?
                //此時將字元作為key值,獲取其value值,並更新start,
                //此時[start,end]區間內不存在重複字元
                start=Math.max(map.get(alpha),start);

            }

            //不論是否更新start,都會更新其map資料結構和結果ans
            ans=Math.max(ans,end-start+1);
            //map中存的是什麼?
            //當前位置的元素,當前位置的後一個下標
            map.put(s.charAt(end),end+1);
        }
        return ans;

    }
}