3403 - Find the Lexicographically Largest String From the Box I
info
- 문제 보기: 3403 - Find the Lexicographically Largest String From the Box I
- 소요 시간: 25분 49초
- 풀이 언어:
java - 체감 난이도: 3️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
문자열
풀이 코드
info
- 메모리: 52700 KB
- 시간: 10 ms
class Solution {
public String answerString(String word, int numFriends) {
if (numFriends == 1) return word; // corner case
// lex order first, desc length order then
final int n = word.length();
final int mxLen = word.length() - (numFriends-1);
Set<String> candSet = new TreeSet<>(Collections.reverseOrder());
char mxChar = 'a';
char[] wordArr = word.toCharArray();
for (char ch : wordArr) mxChar = mxChar < ch ? ch : mxChar;
for (int i = 0; i < n; ++i) {
if (wordArr[i] != mxChar) continue;
int j = Math.min(i+mxLen, n);
candSet.add(word.substring(i, j));
}
return candSet.iterator().next();
}
}
풀이 해설
문자열을 친구 수만큼 빈 문자열이 되지 않도록 쪼개고,
그 문자열들 중에서 lexicographically largest한 문자열을 반환해야 하는 문제이다.
...길어서 lex라고 하겠다. lex largest string을 구하려면
- 사전순으로 뒤에 있는 것 우선
- 비교 가능한 범위에서 문자 구성이 모두 동일하면 길이가 긴 문자열 우선
이 2가지 기준으로 문자열을 필터링해야 한다.
이는 결국 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 보다 "z" 가 더 lex largest 하다는 뜻이라서,
mxChar을 사전에 결정하고 해당 문자로 시작하는 인덱스에서만 후보군을 탐색하도록 그리디한 접근 방식을 떠올렸다.
자바의 TreeSet 사용해보기
TreeSet은 RBT로 구현된, '