- μ ν κ°μ΄ μ μμ λͺ» νμλ λ¬Έμ . κ²°κ΅ ν΄λ΅μ λ΄€λ€.
- Greedyνκ² λ΅μ λ§λ€μ΄λ³΄λ €κ³ νλλ° κ·μΉμ μΈμ°κΈ°κ° μ½μ§ μμλ€.
- κ²°κ΅ μ΄λ―Έ κ²°κ³Ό
result
μ λ€μ΄κ° μλ κ²μ μν©μ λ°λΌ μμ νλ λ°©μμ μ·¨νμ΄μΌ νλ€.
- λ¬Έμμ΄μ μν νλ©΄μ κ²°κ³Ό
result
μ νλμ© λ£κ³ ν΄λΉ λ¬Έμλ₯Ό μ²λ¦¬ν κ² mark[c]
μΌλ‘ νμνλ€.
- λ¨, μ΄λ―Έ κ²°κ³Ό
result
μ λ€μ΄κ° μλ λ¬Έμλ€ μ€ νμ¬ λ¬Έμ s[i]
λ³΄λ€ ν° λ¬Έμλ κ²°κ³Όμμ λ€μ λΉΌλΈλ€. - κ·ΈλμΌλ§ μ¬μ μ μμ (lexicographic order)μ λ°λΌ κ°μ₯ μμ λ¬Έμμ΄μ λ§λ€ μ μκΈ° λλ¬Έμ΄λ€.
- λ¨, λΉΌλΌ λ¬Έμμ΄μ΄ λ§μ§λ§
lastIndex[s[i] - 'a']
μ ν΄λΉλ κ²½μ° λΉΌμ§ μκ³ κ·Έλλ‘ λλ€. - λΉΌλΈ λ¬Έμμ΄μ μ²λ¦¬κ° μλ κ²μ΄κΈ° λλ¬Έμ νμλ₯Ό λ€μ μμ 볡ꡬ μν¨λ€
mark[s[i]] = false
.
- ν΄λ΅μμλ stackμ μ¬μ©νλ κ²μΌλ‘ λμ΄μλλ° κ°λ
μ μΌλ‘λ κΌ stackμ΄λΌκ³ μκ°ν νμλ μλ€.
- λ³Έμ§μ μΌλ‘λ κ²°κ³Ό
result
μμ νμ¬ λ¬Έμ λ³΄λ€ ν° κ² (λ¨, λ§μ§λ§μΈ κ²μ μ μΈ)μ λͺ¨λ μ κ±°νκ³ νμ¬ λ¬Έμλ₯Ό λμ μΆκ° (append) νλ κ²μΌ λΏμ΄λ€. - λ€λ§ κ²°κ³Ό
result
μμ λ¬Έμλ₯Ό λ€μμ λΆν° μ κ±°νλ κ²μ΄ ν¨μ¨μ μ΄λΌμ stack μ²λΌ popνλ λ°©μμΌλ‘ μ κ±°ν λΏμ΄λ€.
class Solution {
public:
static constexpr int CHARS = 'z' - 'a' + 1;
string removeDuplicateLetters(string s) {
// get last index of each characters
vector<int> lastIndex(CHARS);
for (int i = 0; i < s.length(); ++i) {
lastIndex[s[i] - 'a'] = i;
}
vector<char> result;
vector<bool> mark(CHARS);
for (int i = 0; i < s.length(); ++i) {
// skip character if marked
if (mark[s[i] - 'a']) continue;
while (!result.empty()) {
char top = result.back();
// remove bigger characters from stack
// except if the character is last one.
if (top > s[i] && i < lastIndex[top - 'a']) {
mark[top - 'a'] = false;
result.pop_back();
} else {
break;
}
}
// add current character & mark
result.push_back(s[i]);
mark[s[i] - 'a'] = true;
}
// convert into string
return string(result.begin(), result.end());
}
};