Leetcode Java Smallest Subsequence of Distinct Characters
업데이트:
문제
코드
class Solution {
public String smallestSubsequence(String s) {
int[] count = new int[26];
for (char c : s.toCharArray()) {
count[c - 'a']++;
}
boolean[] visited = new boolean[26];
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
count[c - 'a']--;
if (visited[c - 'a']) {
continue;
}
while (!stack.isEmpty() && c < stack.peek() && 0 < count[stack.peek() - 'a']) {
visited[stack.pop() - 'a'] = false;
}
stack.push(c);
visited[c - 'a'] = true;
}
StringBuilder sb = new StringBuilder();
for (char c : stack) {
sb.append(c);
}
return sb.toString();
}
}
결과
설명
-
문자열 s의 문자들을 한 번만 포함된 사전적으로 가장 작은 부분 수열을 찾는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- count는 문자열 s의 문자 갯수를 저장할 배열로, 영문자 갯수인 26 크기의 정수 배열로 초기화하여 s의 문자열 내 각 문자의 위치에 갯수를 더해준다.
- visited는 사용한 문자인지 검증하기 위한 배열로, 영문자 갯수인 26 크기의 부울 배열로 초기화한다.
- stack은 결과 문자열을 만들기 위한 변수로, Stack으로 초기화한다.
- s의 문자들을 순차적으로 c에 넣고 아래를 수행한다.
- count의 해당 문자 순서에 해당하는 갯수를 차감시킨다.
- visited의 해당 문자 순서에 해당하는 값이 true이면 이미 사용했으므로, 다음 반복을 수행한다.
- 아래의 경우를 모두 만족하면, visited 내 stack의 가장 앞 문자에 해당하는 순서의 값을 false로 바꿔준다.
- stack 내 문자들이 존재하는 경우.
- stack의 가장 앞 문자가 c보다 사전적으로 큰 경우.
- count의 stack의 가장 앞 문자에 해당하는 순서의 값이 0보다 큰 경우.
- stack에 c를 넣은 후 visited의 c에 해당하는 순서의 값을 true로 바꾸어준다.
- 위의 반복이 완료되면 stack에 저장된 값을 순차적으로 꺼내 문자열로 만들어 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기