給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
- 示例 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;
}