- λ λ¬Έμμ΄
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]);
}
}