https://leetcode.com/problems/minimum-window-substring/
LeetCode - The World's Leading Online Programming Learning Platform
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
두 문자열이 주어지고 A 문자열의 부분 연속문자열 중 B 문자열의 글자들을 포함하는 제일 짧은 문자열을 구하는 문제이다.
아이디어
문제의 포인트는 확인해야되는 문자열이 "aab" 라면 부분연속 문자열에 a가 2개이상, b가 1개 이상 포함되어야 한다는 것이다.
바로 직전 문제의 슬라이딩 윈도우 알고리즘의 기초와 관련 문제를 포스팅해두었으니 참고하면 좋을 것 같다.
매번 오른쪽 포인터를 늘리면서 판단 조건에 대해 valid 할 때 / invalid 할 때 행동을 어떻게 설정하는지가 관건이다.
백준에서는 투포인터 알고리즘과 항상 같은 카테고리에 들어있는 것 같은데 큰 범위에서 보면 슬라이딩 윈도우도 포인터를 2개를 쓰니 투 포인터라고 할 수 있는 것 같다. 다만 투 포인터 알고리즘은 두 포인터의 이동방향이 좌에서 우로 동일하지 않은 경우도 존재하니 조금은 다르다고 할 수 있겠다.
https://www.acmicpc.net/workbook/view/8977
문제집: 슬라이딩윈도우/투포인터 (haru8986)
www.acmicpc.net
팁으로 문자열 매칭을 하는 경우 int[256] 배열을 생성하면 대소문자, 특수문자를 포함한 ASCII 코드 기반 문자를 쉽게 카운팅할 수 있다.
풀이
class Solution {
public String minWindow(String s, String t) {
int[] arr = new int[256];
int[] pattern = new int[256];
for (int i = 0; i < t.length(); i++){
pattern[t.charAt(i)]++;
}
String answer = "";
int len = s.length()+1;
outer : for (int l = 0, r = 0; r < s.length(); r++){
int c = s.charAt(r);
arr[c]++;
for (int i = 0; i < 256; i++){
if (arr[i] < pattern[i]) continue outer;
}
if (len > r - l + 1){
answer = s.substring(l, r+1);
len = r-l+1;
}
arr[s.charAt(l++)]--;
while(arr[s.charAt(l-1)] >= pattern[s.charAt(l-1)]){
if (pattern[s.charAt(l)] > 0 && len > r - l + 1){
answer = s.substring(l, r+1);
len = r-l+1;
}
arr[s.charAt(l++)]--;
}
}
return answer;
}
}
후기
슬라이딩 윈도우 알고리즘도 어느정도 정형화하여 풀 수 있는 것 같다 (아닌가)
리트코드도 좋은 문제가 많으니 영어에 큰 부담이 없다면 외국계 기업에 생각이 있지 않더라도 한 번 풀어보는게 어떨까!
질문, 피드백은 언제나 환영입니다 :)
'문제풀이 > Leet Code' 카테고리의 다른 글
[LeetCode Medium / Java / 자바] 3. Longest Substring Without Repeating Characters (1) | 2023.10.09 |
---|