문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
영숫자 문자열 s가 주어진다(영숫자 문자열은 영어 소문자와 숫자로 구성된 문자열이다).
주어진 문자열에서 문자 뒤에 다른 문자가 오지 않고, 숫자 뒤에 다른 숫자가 오지 않는 순열을 찾아야 한다. 즉, 인접한 두 문자의 유형이 같지 않아야 한다.
재구성된 문자열을 반환하거나 재구성이 불가능하다면 빈 문자열을 반환해라.
#1
Input: s = "a0b1c2"
Output: "0a1b2c"
Explanation: "0a1b2c"에서 인접한 두 문자의 유형이 동일하지 않다. "a0b1c2", "0a1b2c", "0c2a1b" 또한 유효한 순열이다.
#2
Input: s = "leetcode"
Output: ""
Explanation: "leetcode"는 오직 문자만 있어서 숫자로 구분할 수 없다.
#3
Input: s = "1229857369"
Output: ""
Explanation: "1229857369"는 오직 숫자만 있어서 문자로 구분할 수 없다.
class Solution {
public String reformat(String s) {
StringBuilder letters = new StringBuilder();
StringBuilder digits = new StringBuilder();
for (char c : s.toCharArray()) {
if (Character.isLetter(c)) {
letters.append(c);
} else {
digits.append(c);
}
}
if (Math.abs(letters.length() - digits.length()) > 1) {
return "";
}
StringBuilder result = new StringBuilder();
boolean letterFirst = letters.length() > digits.length();
int i = 0;
int j = 0;
while (i < letters.length() || j < digits.length()) {
if (letterFirst && i < letters.length()) {
result.append(letters.charAt(i++));
}
if (j < digits.length()) {
result.append(digits.charAt(j++));
}
if (!letterFirst && i < letters.length()) {
result.append(letters.charAt(i++));
}
}
return result.toString();
}
}