[384 · Longest Substring Without Repeating Characters - LintCode](https://www.lintcode.com/problem/384/
# Description
Given a string, find the length of the longest substring without repeating characters.
# Example
Example 1:
Input: "abcabcbb"
Output: 3
Explanation: The longest substring is "abc".
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The longest substring is "b".
# Challenge
time complexity O(n)
# Solution
當走到 i 時,只要發現和 set 裡的字符相等,用另一指針找到之前出現過 & 重覆的字符,把它刪走,指針向右移。然後重新再加上現在 i 的這位字符。
# Code
class Solution { | |
public int lengthOfLongestSubstring(String s) { | |
if (s == null || s.length() == 0) return 0; | |
Set<Character> set = new HashSet<>(); | |
int max = 0; | |
int j = 0; | |
for (int i = 0; i < s.length(); i++) { | |
if (set.contains(s.charAt(i))) { | |
// 同向雙指針 都是 for + while <--- while: 不滿足則循環到滿足搭配為止 | |
while (j < i && set.contains(s.charAt(i))) { // 把一開始的第一個 a 刪走,再把現任的 a 加上; | |
// 一直刪,直到刪到 j 與當前 charAt (i) 一樣為止 | |
set.remove(s.charAt(j)); | |
System.out.println("第"+ i + "次 remove了: "+ s.charAt(j) + " ;j = " + j ); | |
j++; | |
} | |
set.add(s.charAt(i)); | |
System.out.println("第"+ i + "次 add了: "+ s.charAt(i) ); | |
} else { | |
set.add(s.charAt(i)); | |
} | |
max = Math.max(max, set.size()); | |
} | |
return max; | |
} | |
} |
input
abcabcbb
output
結果:
3
第3次 remove了: a ;j = 0
第3次 add了: a
第4次 remove了: b ;j = 1
第4次 add了: b
第5次 remove了: c ;j = 2
第5次 add了: c
第6次 remove了: a ;j = 3
第6次 remove了: b ;j = 4
第6次 add了: b
第7次 remove了: c ;j = 5
第7次 remove了: b ;j = 6
第7次 add了: b