[LeetCode] Reformat The String

아르당·6일 전

LeetCode

목록 보기
297/303
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

Problem

영숫자 문자열 s가 주어진다(영숫자 문자열은 영어 소문자와 숫자로 구성된 문자열이다).
주어진 문자열에서 문자 뒤에 다른 문자가 오지 않고, 숫자 뒤에 다른 숫자가 오지 않는 순열을 찾아야 한다. 즉, 인접한 두 문자의 유형이 같지 않아야 한다.
재구성된 문자열을 반환하거나 재구성이 불가능하다면 빈 문자열을 반환해라.

Example

#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"는 오직 숫자만 있어서 문자로 구분할 수 없다.

Constraints

  • 1 <= s.length <= 500
  • s는 오직 영어 소문자나 숫자로 구성된다.

Solved

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();
    }
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글