Leetcode-3:無重復(fù)字符的最長子串

描述:
給定一個字符串,請你找出其中不含有重復(fù)字符的最長子串的長度。

示例 1:

輸入: "abcabcbb"
輸出: 3
解釋: 因為無重復(fù)字符的最長子串是 "abc",所以其長度為 3。

示例 2:

輸入: "bbbbb"
輸出: 1
解釋: 因為無重復(fù)字符的最長子串是 "b",所以其長度為 1。

示例 3:

輸入: "pwwkew"
輸出: 3
解釋: 因為無重復(fù)字符的最長子串是 "wke",所以其長度為 3。

請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

思路:

使用一個變量left記錄無重復(fù)字符子串的左邊界。則長度可以表示為:i - left +1
其中 i 是當前遍歷到的位置。

用HashMap<字符,位置> 儲存每個字符的位置,用temp記錄當前字符串長度。

如果出現(xiàn)重復(fù)字符時,上一次出現(xiàn)+1 的位置開始計算。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s.length()==0 || s==null)
            return 0 ;
        Map<Character,Integer> map = new HashMap<Character,Integer>();
        int left = 0;
        int max = 0;
        for(int i=0;i<s.length();i++){
            Character ch = s.charAt(i);
            if(map.containsKey(ch)){
                //這句代碼防止左邊界再倒退回去
                //比如abba: 訪問完第二個b之后,left=2,如果沒有這句下一步left又變成1了。
                left= Math.max(left,map.get(ch)+1);
            }
            map.put(ch,i);
            max= Math.max(max,i-left+1);
                
        }
        
        return max;
        
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容