Leetcode Java Remove Duplicate Letters
업데이트:
문제
코드
class Solution {
public String removeDuplicateLetters(String s) {
StringBuilder sb = new StringBuilder();
int[] count = new int[26];
boolean[] chars = new boolean[26];
for (char c : s.toCharArray()) {
count[c - 'a'] += 1;
}
for (int i = 0, j = 0; i < s.length(); i++) {
char curr = s.charAt(i);
if (!chars[curr - 'a']) {
while (j > 0 && sb.charAt(j - 1) > curr && count[sb.charAt(j - 1) - 'a'] > 0) {
chars[sb.charAt(j - 1) - 'a'] = false;
sb.deleteCharAt(j - 1);
j--;
}
sb.append(curr);
chars[curr - 'a'] = true;
j++;
}
count[curr - 'a'] -= 1;
}
return sb.toString();
}
}
결과
설명
-
주어진 문자열 s를 이용하여 각 문자의 중복을 제거하고, 문자열의 오름차순으로 정렬하여 반환하는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- sb는 주어진 문자열 s의 중복 제거된 문자열을 동적으로 넣기 위한 변수이다.
- 동적 문자열의 생성시, 효율적인 메모리 사용을 위해 StringBuilder를 사용한다.
- count는 주어진 문자열 s를 알파벳 순서로 존재했는지를 지정하기 위한 변수로, 알파벳 개수인 26으로 크기를 초기화한다.
- chars는 특정 알파벳 문자가 존재했는지 여부를 저장하기 위한 변수로, 알파벳 개수인 26으로 크기를 초기화한다.
- sb는 주어진 문자열 s의 중복 제거된 문자열을 동적으로 넣기 위한 변수이다.
-
s를 반복하여 0(a)부터 25(z)까지 문자의 발생 빈도를 count에 넣어준다.
- 반복문을 통해 정의한 sb에 오름차순으로 중복제거된 문자열을 넣어준다.
- curr에 s의 i번째 문자열을 넣어준다.
- chars의 $curr - a(97)$번째 값이 false이면 아래를 수행한다.
- j가 0보다 크고, sb의 $j - 1$의 ASCII 값이 curr보다 크면서 sb의 $j - 1$번째 문자에 a(97)를 뺀 값이 0보다 큰 경우 count의 $j - 1$번째 문자에 a(97)를 뺀 위치에 false를 넣고, sb에서 $j - 1$번째 값을 제거하고 j를 감소시킨다.
- sb에 curr을 넣어주고, chars의 $curr - a(97)$번째 값에 true를 넣어주고, j를 증가시킨다.
- 반복이 종료되면 count의 $curr - a(97)$번째 값을 감소시킨다.
- 반복이 종료되면 중복을 제거한 오름차순 정렬된 문자의 조합을 넣은 sb를 문자열로 변환하여 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기