給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。(Java實現)

給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。

  • 示例 1:
  •  輸入: "abcabcbb" 	
    
  •  輸出: 3  
    
  •  解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
    
  • 示例 2:
  •  輸入: "bbbbb" 
    
  •  輸出: 1 
    
  •  解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
    
  • 示例 3:
  •  輸入: "pwwkew" 
    
  •  輸出: 3 
    
  •  解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
     請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
    

解題思路:
可以使用滑塊思想,像是滑動窗口
1.定義兩個座標指針:fast 和 slow(也可以理解爲兩個前後指針)
2.fast在前, 一直記錄不重複的元素,更新不重複子串長度
3.當 fast 遇到重複元素,則slow開始後移,刪除掉fast 座標前的所有元素(即重複元素前的所有元素,所以在這裏並不關心哪個元素重複,因爲重複之前的元素都會刪掉)
用hash數組中的標記來決定是否已經重複

public int lengthOfLongestSubstring(String s) {
        int []hash = new int[500];
        int fast = 0;
        int slow = 0;
        int max = 0;
        while (fast < s.length() && slow < s.length()){
            if (hash[s.charAt(fast)] == 0){
                hash[s.charAt(fast)] = 1;
                fast++;
                max = Math.max(max,fast-slow);
            }else {
                hash[s.charAt(slow)] = 0;
                slow++;
            }
        }
        return max;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章