https://leetcode.com/problems/longest-substring-without-repeating-characters/description/
중복 없이 가장 긴 서브스트링의 길이를 반환하란다.
배열이든 뭐든 사용해서 슬라이딩 윈도우 구간 내 중복 문자가 있는지 체크하면 된다.
문제에서 s는 영문자, 숫자, 심볼이나 스페이스도 다 포함한댔으므로 그냥 맵으로 한다.
혹시 ASCII 127개 안에 없는걸수도 있으니까..
left, right 포인터를 두고 슬라이딩 윈도우로 구현한다.
중복 문자를 만나면, 이전 중복 문자를 만났던 곳 +1로 left를 옮긴다 (윈도우를 옮겨 중복 제거된 길이를 다시 잼)
다음 현재 캐릭터의 마지막 포지션인 right로 맵을 다시 갱신해주고,
length는 right - left + 1 비교하면서 가장 긴 값을 갱신한다.
주의해야 할 점은 left 갱신 시 다시 빠꾸하지 않게 Math.max로 보장해줄 필요가 있다는 점
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
int left = 0;
int length = 0;
for (int right=0; right<s.length(); right++) {
char c = s.charAt(right);
if (map.containsKey(c)) {
left = Math.max(left, map.get(c) + 1);
}
map.put(c, right);
length = Math.max(length, right - left + 1);
}
return length;
}
}