- λ λ¬Έμμ΄
s, t κ° μ£Όμ΄μ‘μ λ tμ μλ λͺ¨λ κΈμλ₯Ό ν¬ν¨νλ sμ λΆλΆ λ¬Έμμ΄ μ€ κ°μ₯ κΈΈμ΄κ° μ§§μ κ²μ ꡬνλ λ¬Έμ .
tμ μλ λͺ¨λ κΈμλ₯Ό ν¬ν¨νκΈ°λ§ νλ©΄ λκ³ μμλ μ§ν¬ νμκ° μμΌλ―λ‘ t κ·Έλ¦¬κ³ sμ λΆλΆ λ¬Έμμ΄μ λν΄μ μν΄μλ λ¬Έμμ μΆν λΉλλ₯Ό μΈμ΄μ λΉκ΅νλ©΄ λλ€.- λ¨Όμ
sμ κΈΈμ΄κ° tλ³΄λ€ μμΌλ©΄ μ μ΄μ tμ μν λͺ¨λ λ¬Έμλ₯Ό ν¬ν¨ν μ μμΌλ―λ‘ λ΅μ΄ μλ κ² ββ μΌλ‘ νλ€. tμ μν λ¬Έμμ μΆν λΉλλ₯Ό μΈμ΄ μ μ₯ tCntν΄λλ€.sμ μ΅μ λΆλΆ λ¬Έμμ΄ λ²μ minμ [0, Integer.MAX_VALUE]λ‘ (Integer.MAX_VALUEλ κ°μ΄ μμμ νμνκΈ° μν΄), νμ¬ λΆλΆ λ¬Έμμ΄ λ²μ curλ₯Ό [0, 0]μΌλ‘ μ΄κΈ°ννλ€.- λΆλΆ λ¬Έμμ΄ λ²μ
curμ λ€μκ³Ό κ°μ κ·μΉμΌλ‘ νμ₯, μΆμνλ©΄μ 쑰건μ λ§μ‘±νλ λ²μλ₯Ό μ°Ύλλ€. - λΆλΆ λ¬Έμμ΄μ μΆν λΉλ
sCntμ λμ λ¬Έμμ΄μ μΆν λΉλ tCnt λ₯Ό λΉκ΅νμ¬ νμ¬ λΆλΆ λ¬Έμμ΄μ λμ λ¬Έμμ΄μ΄ ν¬ν¨λλμ§ νμΈ containsνλ€. - ν¬ν¨λμ§ μλ κ²½μ°
contains == false λΆλΆ λ¬Έμμ΄μ λ²μλ₯Ό λ·μͺ½μΌλ‘ νμ₯ ++cur[1] νμ¬ λ λ§μ λ¬Έμκ° λΆλΆ λ¬Έμμ΄μ ν¬ν¨λλλ‘ νλ€. - λ²μκ° νμ₯λμμΌλ―λ‘ μλ‘ μΆκ°λ λ¬Έμ
s.charAt(cur[1])λ₯Ό λΆλΆ λ¬Έμμ΄μ μΆν λΉλ λ°°μ΄ sCntμ μΆκ° ++sCnt[ordAt(s, cur[1])]νλ€.
- ν¬ν¨λλ κ²½μ°
contains == true λΆλΆ λ¬Έμμ΄μ λ²μλ₯Ό μμͺ½μμ μΆμ --cur[0] νμ¬ λ μ μ λ¬Έμμ΄λ‘λ 쑰건μ λ§μ‘±ν μ μλμ§ νμΈνλ€. - λ²μκ° μΆμλμμΌλ―λ‘ μ κ±°λ λ¬Έμ
s.charAt(cur[0])λ₯Ό λΆλΆ λ¬Έμμ΄μ μΆν λΉλ λ°°μ΄ sCntμμ μ κ±° --sCnt[ordAt(s, cur[0])]νλ€.
- λ¬Έμμ΄μ λ²μκ° λ¬Έμμ κΈΈμ΄
M = s.length()λ₯Ό μ΄κ³Όνμ§ μλ λ²μμμ νμ₯, μΆμλ₯Ό μ§ννλ€.
class Solution {
final int L = 2 * ('z' - 'a' + 1);
int ordAt(String s, int i) {
if (i >= s.length()) {
return 0;
}
int c = s.charAt(i);
return c >= 'a' && c <= 'z'?
c - 'a' : c - 'A' + L / 2;
}
public String minWindow(String s, String t) {
int M = s.length();
int N = t.length();
if (M < N) return "";
int[] sCnt = new int[L];
int[] tCnt = new int[L];
for (int i = 0; i < N; ++i) {
++tCnt[ordAt(t, i)];
}
int[] min = new int[]{ 0, Integer.MAX_VALUE };
int[] cur = new int[]{ 0, 0 };
while (cur[1] <= M) {
int minLength = min[1] - min[0];
int length = cur[1] - cur[0];
boolean contains = true;
for (int i = 0; i < L; ++i) {
if (sCnt[i] < tCnt[i]) {
contains = false;
break;
}
}
if (contains) {
if (length < minLength) {
min[0] = cur[0];
min[1] = cur[1];
}
--sCnt[ordAt(s, cur[0])];
++cur[0];
} else {
++sCnt[ordAt(s, cur[1])];
++cur[1];
}
}
if (min[1] == Integer.MAX_VALUE) return "";
return s.substring(min[0], min[1]);
}
}